aboutsummaryrefslogtreecommitdiff
path: root/resp.go
diff options
context:
space:
mode:
Diffstat (limited to 'resp.go')
-rw-r--r--resp.go50
1 files changed, 38 insertions, 12 deletions
diff --git a/resp.go b/resp.go
index f90c486..408dcd3 100644
--- a/resp.go
+++ b/resp.go
@@ -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]
}