forked from tangled.org/core
Monorepo for Tangled — https://tangled.org
1package knotserver 2 3import ( 4 "compress/gzip" 5 "io" 6 "net/http" 7 "path/filepath" 8 9 "github.com/go-chi/chi/v5" 10 "github.com/sotangled/tangled/knotserver/git/service" 11) 12 13func (d *Handle) InfoRefs(w http.ResponseWriter, r *http.Request) { 14 did := chi.URLParam(r, "did") 15 name := chi.URLParam(r, "name") 16 repo := filepath.Join(d.c.Repo.ScanPath, did, name) 17 18 w.Header().Set("content-type", "application/x-git-upload-pack-advertisement") 19 w.WriteHeader(http.StatusOK) 20 21 cmd := service.ServiceCommand{ 22 Dir: repo, 23 Stdout: w, 24 } 25 26 if err := cmd.InfoRefs(); err != nil { 27 http.Error(w, err.Error(), 500) 28 d.l.Error("git: failed to execute git-upload-pack (info/refs)", "handler", "InfoRefs", "error", err) 29 return 30 } 31} 32 33func (d *Handle) UploadPack(w http.ResponseWriter, r *http.Request) { 34 did := chi.URLParam(r, "did") 35 name := chi.URLParam(r, "name") 36 repo := filepath.Join(d.c.Repo.ScanPath, did, name) 37 38 w.Header().Set("content-type", "application/x-git-upload-pack-result") 39 w.Header().Set("Connection", "Keep-Alive") 40 w.Header().Set("Transfer-Encoding", "chunked") 41 w.WriteHeader(http.StatusOK) 42 43 cmd := service.ServiceCommand{ 44 Dir: repo, 45 Stdout: w, 46 } 47 48 var reader io.ReadCloser 49 reader = r.Body 50 51 if r.Header.Get("Content-Encoding") == "gzip" { 52 reader, err := gzip.NewReader(r.Body) 53 if err != nil { 54 http.Error(w, err.Error(), 500) 55 d.l.Error("git: failed to create gzip reader", "handler", "UploadPack", "error", err) 56 return 57 } 58 defer reader.Close() 59 } 60 61 cmd.Stdin = reader 62 if err := cmd.UploadPack(); err != nil { 63 http.Error(w, err.Error(), 500) 64 d.l.Error("git: failed to execute git-upload-pack", "handler", "UploadPack", "error", err) 65 return 66 } 67}