diff --git a/appview/state/git_http.go b/appview/state/git_http.go --- a/appview/state/git_http.go +++ b/appview/state/git_http.go @@ -25,6 +25,23 @@ } +func (s *State) UploadArchive(w http.ResponseWriter, r *http.Request) { + user, ok := r.Context().Value("resolvedId").(identity.Identity) + if !ok { + http.Error(w, "failed to resolve user", http.StatusInternalServerError) + return + } + repo := r.Context().Value("repo").(*models.Repo) + + scheme := "https" + if s.config.Core.Dev { + scheme = "http" + } + + targetURL := fmt.Sprintf("%s://%s/%s/%s/git-upload-archive?%s", scheme, repo.Knot, user.DID, repo.Name, r.URL.RawQuery) + s.proxyRequest(w, r, targetURL) +} + func (s *State) UploadPack(w http.ResponseWriter, r *http.Request) { user, ok := r.Context().Value("resolvedId").(identity.Identity) if !ok { diff --git a/appview/state/router.go b/appview/state/router.go --- a/appview/state/router.go +++ b/appview/state/router.go @@ -101,6 +101,7 @@ // These routes get proxied to the knot r.Get("/info/refs", s.InfoRefs) + r.Post("/git-upload-archive", s.UploadArchive) r.Post("/git-upload-pack", s.UploadPack) r.Post("/git-receive-pack", s.ReceivePack)