switch to atreugo
1 file changed, 41 insertions(+), 45 deletions(-)
changed files
M routes/git.go → routes/git.go
@@ -1,87 +1,83 @@ package routes import ( + "bytes" "compress/gzip" "log" "net/http" "path" "alin.ovh/elgit/git/service" + "github.com/savsgio/atreugo/v11" + "github.com/valyala/fasthttp" ) -func (d *deps) InfoRefs(w http.ResponseWriter, r *http.Request, params map[string]string) { - name := path.Join(params["category"], params["name"]) +func (d *deps) InfoRefs(rc *atreugo.RequestCtx) error { + category, _ := rc.UserValue("category").(string) + name, _ := rc.UserValue("name").(string) + repoName := path.Join(category, name) - repo, err := d.GetCleanPath(name) + repo, err := d.GetCleanPath(repoName) if err != nil { log.Printf("getcleanpath error: %v", err) - d.Write404(w) - return + return ErrNotFound + } + + svc := rc.QueryArgs().Peek("service") + if string(svc) == "git-receive-pack" { + return rc.TextResponse("no pushing allowed!", fasthttp.StatusBadRequest) } - w.Header().Set("content-type", "application/x-git-upload-pack-advertisement") - w.Header().Set("cache-control", "no-cache") - w.WriteHeader(http.StatusOK) + rc.SetStatusCode(http.StatusOK) + rc.Response.Header.Set("content-type", "application/x-git-upload-pack-advertisement") + rc.Response.Header.Set("cache-control", "no-cache") cmd := service.Command{ Dir: repo, - Stdout: w, + Stdout: rc, } - if err := cmd.InfoRefs(r.Context()); err != nil { - http.Error(w, err.Error(), 500) - log.Printf("git: failed to execute git-upload-pack (info/refs) %s", err) - - return - } + return cmd.InfoRefs(rc) } -func (d *deps) UploadPack(w http.ResponseWriter, r *http.Request, params map[string]string) { - name := path.Join(params["category"], params["name"]) +func (d *deps) UploadPack(rc *atreugo.RequestCtx) error { + category, _ := rc.UserValue("category").(string) + name, _ := rc.UserValue("name").(string) + repoName := path.Join(category, name) - repo, err := d.GetCleanPath(name) + repo, err := d.GetCleanPath(repoName) if err != nil { log.Printf("getcleanpath error: %v", err) - d.Write404(w) - return - } - - w.Header().Set("content-type", "application/x-git-upload-pack-result") - w.Header().Set("Connection", "Keep-Alive") - w.Header().Set("Transfer-Encoding", "chunked") - w.Header().Set("cache-control", "no-cache") - w.WriteHeader(http.StatusOK) - - cmd := service.Command{ - Dir: repo, - Stdout: w, + return ErrNotFound } - var reader = r.Body + rc.SetStatusCode(http.StatusOK) + rc.SetContentType("application/x-git-upload-pack-result") + rc.Response.Header.Set("Connection", "Keep-Alive") + rc.Response.Header.Set("Transfer-Encoding", "chunked") + rc.Response.Header.Set("Cache-Control", "no-cache") - if r.Header.Get("Content-Encoding") == "gzip" { - reader, err = gzip.NewReader(r.Body) + var reader = rc.Request.BodyStream() + if bytes.Contains(rc.Request.Header.ContentEncoding(), []byte("gzip")) { + reader, err = gzip.NewReader(reader) if err != nil { - http.Error(w, err.Error(), 500) - log.Printf("git: failed to create gzip reader: %s", err) - - return + return rc.ErrorResponse(err, 500) } defer func() { - err := reader.Close() + err := rc.Request.CloseBodyStream() if err != nil { log.Printf("git: failed to close gzip reader: %s", err) } }() } - cmd.Stdin = reader - if err := cmd.UploadPack(r.Context()); err != nil { - http.Error(w, err.Error(), 500) - log.Printf("git: failed to execute git-upload-pack %s", err) - - return + cmd := service.Command{ + Dir: repo, + Stdout: rc, + Stdin: reader, } + + return cmd.UploadPack(rc) }