diff options
| author | Grégoire Duchêne <gduchene@awhk.org> | 2019-08-22 23:20:54 +0100 |
|---|---|---|
| committer | Grégoire Duchêne <gduchene@awhk.org> | 2019-08-22 23:20:54 +0100 |
| commit | 286b6bbf425e204219dc4df27b06f25d1b525889 (patch) | |
| tree | ef91ac695b640471df7164d8607e48b413ca3921 | |
| parent | f4bc08ec98c115e48c9272dd98812e7f21d3d302 (diff) | |
First version
| -rw-r--r-- | README.md | 12 | ||||
| -rw-r--r-- | main.go | 55 |
2 files changed, 67 insertions, 0 deletions
diff --git a/README.md b/README.md new file mode 100644 index 0000000..d94e0f3 --- /dev/null +++ b/README.md @@ -0,0 +1,12 @@ +# go-import-redirect + +A thing that tells `go get` where to get Go packages and redirects users +to https://godoc.org. It runs on AWS Lambda, but can easily be adapted +to run elsewhere. + +You need to set up the following environment variables for it to work: + +* `DEST` for the base URL that will be used to build the repository URL, +* `PREFIX` for the prefix that must be removed from your package name, + e.g. `golang.org/x/` for `golang.org/x/image`, and +* `VCS` for the type of VCS you are using, e.g. `git`. @@ -0,0 +1,55 @@ +// Copyright (c) 2019, Grégoire Duchêne <gduchene@awhk.org> +// +// Use of this source code is governed by the ISC license that can be +// found in the LICENSE file. + +package main + +import ( + "context" + "fmt" + "github.com/aws/aws-lambda-go/events" + "github.com/aws/aws-lambda-go/lambda" + "os" + "path" + "strings" +) + +func getDest(dest, repo string) string { + dest = strings.TrimRight(dest, "/") + return fmt.Sprintf("%s/%s", dest, repo) +} + +func getRepo(pkg, prefix string) string { + prefix = strings.TrimRight(prefix, "/") + path := strings.TrimLeft(strings.TrimPrefix(pkg, prefix), "/") + return strings.Split(path, "/")[0] +} + +func redirect(ctx context.Context, req events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) { + var ( + pkg = path.Join(req.Headers["Host"], req.Path) + dest = getDest(os.Getenv("DEST"), getRepo(pkg, os.Getenv("PREFIX"))) + doc = fmt.Sprintf("https://godoc.org/%s", pkg) + vcs = os.Getenv("VCS") + body = fmt.Sprintf(`<!doctype html> +<meta name="go-import" content="%s %s %s"> +<title>go-import-redirect</title> +`, pkg, vcs, dest) + resp = events.APIGatewayProxyResponse{ + Body: body, + Headers: map[string]string{"Content-Type": "text/html; charset=utf-8"}, + } + ) + if v, ok := req.QueryStringParameters["go-get"]; ok && v == "1" { + resp.StatusCode = 200 + } else { + resp.Headers["Location"] = doc + resp.StatusCode = 302 + } + return resp, nil +} + +func main() { + lambda.Start(redirect) +} |
