diff options
Diffstat (limited to 'resp.go')
| -rw-r--r-- | resp.go | 50 |
1 files changed, 38 insertions, 12 deletions
@@ -4,22 +4,48 @@ package main import ( - "fmt" - "os" + "log" + "net/http" + "path" "strings" + "text/template" ) -func GetBody(pkg string) string { - dest := GetDest(os.Getenv("PREFIX"), os.Getenv("DEST"), pkg) - return fmt.Sprintf(`<!doctype html> -<meta name="go-import" content="%s %s %s"> +var body = template.Must(template.New("").Parse(`<!doctype html> +<meta name="go-import" content="{{.Package}} {{.VCS}} {{.Repository}}"> <title>go-import-redirect</title> -`, pkg, os.Getenv("VCS"), dest) +`)) + +type bodyData struct{ Package, Repository, VCS string } + +type redirector struct{ from, to, vcs string } + +var _ http.Handler = &redirector{} + +func (h *redirector) ServeHTTP(w http.ResponseWriter, req *http.Request) { + if req.Method != http.MethodGet { + w.Header().Set("Allow", http.MethodGet) + w.WriteHeader(http.StatusMethodNotAllowed) + return + } + + pkg := path.Join(req.Host, req.URL.Path) + if req.URL.Query().Get("go-get") != "1" { + w.Header().Set("Location", "https://pkg.go.dev/"+pkg) + w.WriteHeader(http.StatusFound) + return + } + dest := h.getRepo(pkg) + w.Header().Set("Content-Type", "text/html; charset=utf-8") + w.WriteHeader(http.StatusOK) + if err := body.Execute(w, bodyData{pkg, dest, h.vcs}); err != nil { + log.Println(err) + } } -func GetDest(srcPrefix, destPrefix, pkg string) string { - srcPrefix = strings.TrimRight(srcPrefix, "/") - destPrefix = strings.TrimRight(destPrefix, "/") - path := strings.TrimLeft(strings.TrimPrefix(pkg, srcPrefix), "/") - return destPrefix + "/" + strings.Split(path, "/")[0] +func (h *redirector) getRepo(pkg string) string { + from := strings.TrimRight(h.from, "/") + to := strings.TrimRight(h.to, "/") + path := strings.TrimLeft(strings.TrimPrefix(pkg, from), "/") + return to + "/" + strings.Split(path, "/")[0] } |
