forked from
tangled.org/core
fork
Configure Feed
Select the types of activity you want to include in your feed.
Monorepo for Tangled
fork
Configure Feed
Select the types of activity you want to include in your feed.
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}