package middleware import ( "net/http" "github.com/go-chi/chi/v5" ) // GetHead automatically route undefined HEAD requests to GET handlers. func GetHead(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { if r.Method == "HEAD" { rctx := chi.RouteContext(r.Context()) routePath := rctx.RoutePath if routePath == "" { if r.URL.RawPath != "" { routePath = r.URL.RawPath } else { routePath = r.URL.Path } } // Temporary routing context to look-ahead before routing the request tctx := chi.NewRouteContext() // Attempt to find a HEAD handler for the routing path, if not found, traverse // the router as through its a GET route, but proceed with the request // with the HEAD method. if !rctx.Routes.Match(tctx, "HEAD", routePath) { rctx.RouteMethod = "GET" rctx.RoutePath = routePath next.ServeHTTP(w, r) return } } next.ServeHTTP(w, r) }) }