From d16142029dd6b58d364125c5f2cf69c72f5667e6 Mon Sep 17 00:00:00 2001 From: Anirudh Oppiliappan Date: Sun, 11 May 2025 18:47:35 +0300 Subject: [PATCH] appview: state: add GoImport middleware This serves the go-import meta tag if the user-agent is Go-http-client/1.1 and there's a ?go-get=1 query parameter present. This should run before the router 404's a path that technically doesn't exist like tangled.sh/foo.com/some-go/v5. --- appview/state/middleware.go | 35 ++++++++++++++++++++++++++++++++++- appview/state/router.go | 2 ++ 2 files changed, 36 insertions(+), 1 deletion(-) 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) { -- 2.51.2