forked from tangled.org/core
this repo has no description
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, _ := securejoin.SecureJoin(d.c.Repo.ScanPath, filepath.Join(did, name)) 38 39 w.Header().Set("content-type", "application/x-git-upload-pack-result") 40 w.Header().Set("Connection", "Keep-Alive") 41 w.Header().Set("Transfer-Encoding", "chunked") 42 w.WriteHeader(http.StatusOK) 43 44 cmd := service.ServiceCommand{ 45 Dir: repo, 46 Stdout: w, 47 } 48 49 var reader io.ReadCloser 50 reader = r.Body 51 52 if r.Header.Get("Content-Encoding") == "gzip" { 53 reader, err := gzip.NewReader(r.Body) 54 if err != nil { 55 writeError(w, err.Error(), 500) 56 d.l.Error("git: failed to create gzip reader", "handler", "UploadPack", "error", err) 57 return 58 } 59 defer reader.Close() 60 } 61 62 cmd.Stdin = reader 63 if err := cmd.UploadPack(); err != nil { 64 writeError(w, err.Error(), 500) 65 d.l.Error("git: failed to execute git-upload-pack", "handler", "UploadPack", "error", err) 66 return 67 } 68}