diff --git a/appview/state/middleware.go b/appview/state/middleware.go index 1baabcf1..6c0b6571 100644 --- a/appview/state/middleware.go +++ b/appview/state/middleware.go @@ -2,6 +2,7 @@ package state import ( "context" + "fmt" "log" "net/http" "strconv" @@ -131,7 +132,7 @@ func ResolveRepo(s *State) middleware.Middleware { if err != nil { // invalid did or handle log.Println("failed to resolve repo") - w.WriteHeader(http.StatusNotFound) + s.pages.Error404(w) return } @@ -175,3 +176,35 @@ func ResolvePull(s *State) middleware.Middleware { }) } } + +// this should serve the go-import meta tag even if the path is technically +// a 404 like tangled.sh/oppi.li/go-git/v5 +func GoImport(s *State) middleware.Middleware { + return func(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + f, err := s.fullyResolvedRepo(r) + if err != nil { + log.Println("failed to fully resolve repo", err) + http.Error(w, "invalid repo url", http.StatusNotFound) + return + } + + fullName := f.OwnerHandle() + "/" + f.RepoName + + if r.Header.Get("User-Agent") == "Go-http-client/1.1" { + if r.URL.Query().Get("go-get") == "1" { + html := fmt.Sprintf( + ``, + fullName, + fullName, + ) + w.Header().Set("Content-Type", "text/html") + w.Write([]byte(html)) + return + } + } + + next.ServeHTTP(w, r) + }) + } +} diff --git a/appview/state/router.go b/appview/state/router.go index d8a5ad34..8401cbeb 100644 --- a/appview/state/router.go +++ b/appview/state/router.go @@ -58,6 +58,8 @@ func (s *State) UserRouter() http.Handler { r.Get("/", s.Profile) r.With(ResolveRepo(s)).Route("/{repo}", func(r chi.Router) { + r.Use(GoImport(s)) + r.Get("/", s.RepoIndex) r.Get("/commits/{ref}", s.RepoLog) r.Route("/tree/{ref}", func(r chi.Router) {