arnaucube
arnaucube/gitviewPublic Self-hosted repository
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}