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/git | |
| parent | f19adedc4b7f71c824a59d4a797bd8872bdb0bbd (diff) | |
| download | cerrado-2c0347566f99afec2e3963d74f4fc970e6187217.tar.gz cerrado-2c0347566f99afec2e3963d74f4fc970e6187217.tar.bz2 cerrado-2c0347566f99afec2e3963d74f4fc970e6187217.zip  | |
feat: Add initial support for http git clonev0.2.1
Diffstat (limited to 'pkg/handler/git')
| -rw-r--r-- | pkg/handler/git/handler.go | 44 | 
1 files changed, 44 insertions, 0 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")  | 
