gitview/internal/routes/git.go
internal/routes/git.goRaw
1package routes
2
3import (
4 "compress/gzip"
5 "io"
6 "log"
7 "net/http"
8 "path/filepath"
9
10 securejoin "github.com/cyphar/filepath-securejoin"
11 "gitview/internal/git/service"
12)
13
14func (d *deps) InfoRefs(w http.ResponseWriter, r *http.Request) {
15 name := r.PathValue("name")
16 if d.isIgnored(name) {
17 d.Write404(w)
18 return
19 }
20 name = filepath.Clean(name)
21
22 repo, err := securejoin.SecureJoin(d.c.Repo.ScanPath, name)
23 if err != nil {
24 log.Printf("securejoin error: %v", err)
25 d.Write404(w)
26 return
27 }
28
29 w.Header().Set("content-type", "application/x-git-upload-pack-advertisement")
30 w.WriteHeader(http.StatusOK)
31
32 cmd := service.ServiceCommand{
33 Dir: repo,
34 Stdout: w,
35 }
36
37 if err := cmd.InfoRefs(); err != nil {
38 http.Error(w, err.Error(), http.StatusInternalServerError)
39 log.Printf("git: failed to execute git-upload-pack (info/refs) %s", err)
40 return
41 }
42}
43
44func (d *deps) UploadPack(w http.ResponseWriter, r *http.Request) {
45 name := r.PathValue("name")
46 if d.isIgnored(name) {
47 d.Write404(w)
48 return
49 }
50 name = filepath.Clean(name)
51
52 repo, err := securejoin.SecureJoin(d.c.Repo.ScanPath, name)
53 if err != nil {
54 log.Printf("securejoin error: %v", err)
55 d.Write404(w)
56 return
57 }
58
59 w.Header().Set("content-type", "application/x-git-upload-pack-result")
60 w.Header().Set("Connection", "Keep-Alive")
61 w.Header().Set("Transfer-Encoding", "chunked")
62 w.WriteHeader(http.StatusOK)
63
64 cmd := service.ServiceCommand{
65 Dir: repo,
66 Stdout: w,
67 }
68
69 var reader io.ReadCloser
70 reader = r.Body
71
72 if r.Header.Get("Content-Encoding") == "gzip" {
73 reader, err = gzip.NewReader(r.Body)
74 if err != nil {
75 http.Error(w, err.Error(), http.StatusInternalServerError)
76 log.Printf("git: failed to create gzip reader: %s", err)
77 return
78 }
79 defer func() { _ = reader.Close() }()
80 }
81
82 cmd.Stdin = reader
83 if err := cmd.UploadPack(); err != nil {
84 http.Error(w, err.Error(), http.StatusInternalServerError)
85 log.Printf("git: failed to execute git-upload-pack %s", err)
86 return
87 }
88}