forked from tangled.org/core
Monorepo for Tangled — https://tangled.org

Compare changes

Choose any two refs to compare.

Changed files
+25
knotserver
+25
knotserver/router.go
··· 5 5 "fmt" 6 6 "log/slog" 7 7 "net/http" 8 + "strings" 8 9 9 10 "github.com/go-chi/chi/v5" 10 11 "tangled.org/core/idresolver" ··· 78 79 }) 79 80 80 81 r.Route("/{did}", func(r chi.Router) { 82 + r.Use(h.resolveDidRedirect) 81 83 r.Route("/{name}", func(r chi.Router) { 82 84 // routes for git operations 83 85 r.Get("/info/refs", h.InfoRefs) ··· 114 116 return xrpc.Router() 115 117 } 116 118 119 + func (h *Knot) resolveDidRedirect(next http.Handler) http.Handler { 120 + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 121 + didOrHandle := chi.URLParam(r, "did") 122 + if strings.HasPrefix(didOrHandle, "did:") { 123 + next.ServeHTTP(w, r) 124 + return 125 + } 126 + 127 + trimmed := strings.TrimPrefix(didOrHandle, "@") 128 + id, err := h.resolver.ResolveIdent(r.Context(), trimmed) 129 + if err != nil { 130 + // invalid did or handle 131 + h.l.Error("failed to resolve did/handle", "handle", trimmed, "err", err) 132 + http.Error(w, fmt.Sprintf("failed to resolve did/handle: %s", trimmed), http.StatusInternalServerError) 133 + return 134 + } 135 + 136 + suffix := strings.TrimPrefix(r.URL.Path, "/"+didOrHandle) 137 + newPath := fmt.Sprintf("/%s/%s?%s", id.DID.String(), suffix, r.URL.RawQuery) 138 + http.Redirect(w, r, newPath, http.StatusTemporaryRedirect) 139 + }) 140 + } 141 + 117 142 func (h *Knot) configureOwner() error { 118 143 cfgOwner := h.c.Server.Owner 119 144