diff options
Diffstat (limited to 'cmd/go-import-redirect-aws/main.go')
| -rw-r--r-- | cmd/go-import-redirect-aws/main.go | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/cmd/go-import-redirect-aws/main.go b/cmd/go-import-redirect-aws/main.go new file mode 100644 index 0000000..fb758a3 --- /dev/null +++ b/cmd/go-import-redirect-aws/main.go @@ -0,0 +1,58 @@ +// SPDX-FileCopyrightText: © 2019 Grégoire Duchêne <gduchene@awhk.org> +// SPDX-License-Identifier: ISC + +package main + +import ( + "context" + "net/http" + "os" + "path" + "regexp" + "strings" + + "github.com/aws/aws-lambda-go/events" + "github.com/aws/aws-lambda-go/lambda" + + "go.awhk.org/go-import-redirect/pkg/redirector" +) + +var transf = redirector.Transformer{ + Pattern: &redirector.Pattern{regexp.MustCompile(strings.ReplaceAll(os.Getenv("FROM"), `\\`, `\`))}, + Replacement: os.Getenv("TO"), + VCS: os.Getenv("VCS"), +} + +func redirect(ctx context.Context, req events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) { + pkg := path.Join(req.Headers["Host"], req.Path) + + if !transf.Pattern.MatchString(pkg) { + return events.APIGatewayProxyResponse{StatusCode: http.StatusNotFound}, nil + } + + if v, ok := req.QueryStringParameters["go-get"]; !ok || v != "1" { + return events.APIGatewayProxyResponse{ + Headers: map[string]string{"Location": "https://pkg.go.dev/" + pkg}, + StatusCode: http.StatusFound, + }, nil + } + + data := redirector.TemplateData{ + Package: pkg, + Repository: transf.Pattern.ReplaceAllString(pkg, transf.Replacement), + VCS: transf.VCS, + } + var buf strings.Builder + if err := redirector.DefaultTemplate.Execute(&buf, data); err != nil { + return events.APIGatewayProxyResponse{}, err + } + return events.APIGatewayProxyResponse{ + Body: buf.String(), + Headers: map[string]string{"Content-Type": "text/html; charset=utf-8"}, + StatusCode: http.StatusOK, + }, nil +} + +func main() { + lambda.Start(redirect) +} |
