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