diff options
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") | 
