forked from tangled.org/core
this repo has no description

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.

anirudh.fi d1614202 bbf2bd85

verified
Changed files
+36 -1
appview
+34 -1
appview/state/middleware.go
···
import (
"context"
+
"fmt"
"log"
"net/http"
"strconv"
···
if err != nil {
// invalid did or handle
log.Println("failed to resolve repo")
-
w.WriteHeader(http.StatusNotFound)
+
s.pages.Error404(w)
return
}
···
})
}
}
+
+
// 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(
+
`<meta name="go-import" content="tangled.sh/%s git https://tangled.sh/%s"/>`,
+
fullName,
+
fullName,
+
)
+
w.Header().Set("Content-Type", "text/html")
+
w.Write([]byte(html))
+
return
+
}
+
}
+
+
next.ServeHTTP(w, r)
+
})
+
}
+
}
+2
appview/state/router.go
···
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) {