diff options
author | Gabriel A. Giovanini <mail@gabrielgio.me> | 2025-03-30 17:34:11 +0200 |
---|---|---|
committer | Gabriel A. Giovanini <mail@gabrielgio.me> | 2025-03-30 17:34:11 +0200 |
commit | 2c0347566f99afec2e3963d74f4fc970e6187217 (patch) | |
tree | 0c63e87823ab595fffcd474143fa10269a4f65fd /pkg/handler | |
parent | f19adedc4b7f71c824a59d4a797bd8872bdb0bbd (diff) | |
download | cerrado-2c0347566f99afec2e3963d74f4fc970e6187217.tar.gz cerrado-2c0347566f99afec2e3963d74f4fc970e6187217.tar.bz2 cerrado-2c0347566f99afec2e3963d74f4fc970e6187217.zip |
Diffstat (limited to 'pkg/handler')
-rw-r--r-- | pkg/handler/git/handler.go | 44 | ||||
-rw-r--r-- | pkg/handler/router.go | 3 |
2 files changed, 46 insertions, 1 deletions
diff --git a/pkg/handler/git/handler.go b/pkg/handler/git/handler.go index a9be54c..61765bb 100644 --- a/pkg/handler/git/handler.go +++ b/pkg/handler/git/handler.go @@ -2,6 +2,7 @@ package git import ( "bytes" + "compress/gzip" "errors" "fmt" "io" @@ -115,6 +116,49 @@ func (g *GitHandler) Archive(w http.ResponseWriter, r *http.Request) error { return nil } +func (g *GitHandler) Multiplex(w http.ResponseWriter, r *http.Request) error { + path := r.PathValue("rest") + name := r.PathValue("name") + + if r.URL.RawQuery == "service=git-receive-pack" { + ext.BadRequest(w, r, "no pushing allowed") + return nil + } + + if path == "info/refs" && r.URL.RawQuery == "service=git-upload-pack" && r.Method == "GET" { + w.Header().Set("content-type", "application/x-git-upload-pack-advertisement") + + err := g.gitService.WriteInfoRefs(r.Context(), name, w) + if err != nil { + slog.Error("Error WriteInfoRefs", "error", err) + } + } else if path == "git-upload-pack" && r.Method == "POST" { + w.Header().Set("content-type", "application/x-git-upload-pack-result") + w.Header().Set("Connection", "Keep-Alive") + w.Header().Set("Transfer-Encoding", "chunked") + w.WriteHeader(http.StatusOK) + + reader := r.Body + + if r.Header.Get("Content-Encoding") == "gzip" { + reader, err := gzip.NewReader(r.Body) + if err != nil { + return err + } + defer reader.Close() + } + + err := g.gitService.WriteUploadPack(r.Context(), name, reader, w) + if err != nil { + slog.Error("Error WriteUploadPack", "error", err) + } + } else if r.Method == "GET" { + return g.Summary(w, r) + } + + return nil +} + func (g *GitHandler) Summary(w http.ResponseWriter, r *http.Request) error { ext.SetHTML(w) name := r.PathValue("name") diff --git a/pkg/handler/router.go b/pkg/handler/router.go index e461922..fea8827 100644 --- a/pkg/handler/router.go +++ b/pkg/handler/router.go @@ -46,7 +46,8 @@ func MountHandler( mux.HandleFunc("/static/{file}", staticHandler) mux.HandleFunc("/{name}/about/{$}", gitHandler.About) - mux.HandleFunc("/{name}/", gitHandler.Summary) + mux.HandleFunc("/{name}", gitHandler.Multiplex) + mux.HandleFunc("/{name}/{rest...}", gitHandler.Multiplex) mux.HandleFunc("/{name}/refs/{$}", gitHandler.Refs) mux.HandleFunc("/{name}/tree/{ref}/{rest...}", gitHandler.Tree) mux.HandleFunc("/{name}/blob/{ref}/{rest...}", gitHandler.Blob) |