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}