diff --git a/routers/repo/http.go b/routers/repo/http.go index d41c63ba35..63cce0f713 100644 --- a/routers/repo/http.go +++ b/routers/repo/http.go @@ -277,11 +277,56 @@ func HTTP(ctx *context.Context) { } } - HTTPBackend(ctx, &serviceConfig{ + w := ctx.Resp + r := ctx.Req.Request + cfg := &serviceConfig{ UploadPack: true, ReceivePack: true, Env: environ, - })(ctx.Resp, ctx.Req.Request) + } + + for _, route := range routes { + r.URL.Path = strings.ToLower(r.URL.Path) // blue: In case some repo name has upper case name + if m := route.reg.FindStringSubmatch(r.URL.Path); m != nil { + if setting.Repository.DisableHTTPGit { + w.WriteHeader(http.StatusForbidden) + _, err := w.Write([]byte("Interacting with repositories by HTTP protocol is not allowed")) + if err != nil { + log.Error(err.Error()) + } + return + } + if route.method != r.Method { + if r.Proto == "HTTP/1.1" { + w.WriteHeader(http.StatusMethodNotAllowed) + _, err := w.Write([]byte("Method Not Allowed")) + if err != nil { + log.Error(err.Error()) + } + } else { + w.WriteHeader(http.StatusBadRequest) + _, err := w.Write([]byte("Bad Request")) + if err != nil { + log.Error(err.Error()) + } + } + return + } + + file := strings.Replace(r.URL.Path, m[1]+"/", "", 1) + dir, err := getGitRepoPath(m[1]) + if err != nil { + log.Error(err.Error()) + ctx.NotFound("Smart Git HTTP", err) + return + } + + route.handler(serviceHandler{cfg, w, r, dir, file, cfg.Env}) + return + } + } + + ctx.NotFound("Smart Git HTTP", nil) } type serviceConfig struct { @@ -522,51 +567,3 @@ func getGitRepoPath(subdir string) (string, error) { return fpath, nil } - -// HTTPBackend middleware for git smart HTTP protocol -func HTTPBackend(ctx *context.Context, cfg *serviceConfig) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - for _, route := range routes { - r.URL.Path = strings.ToLower(r.URL.Path) // blue: In case some repo name has upper case name - if m := route.reg.FindStringSubmatch(r.URL.Path); m != nil { - if setting.Repository.DisableHTTPGit { - w.WriteHeader(http.StatusForbidden) - _, err := w.Write([]byte("Interacting with repositories by HTTP protocol is not allowed")) - if err != nil { - log.Error(err.Error()) - } - return - } - if route.method != r.Method { - if r.Proto == "HTTP/1.1" { - w.WriteHeader(http.StatusMethodNotAllowed) - _, err := w.Write([]byte("Method Not Allowed")) - if err != nil { - log.Error(err.Error()) - } - } else { - w.WriteHeader(http.StatusBadRequest) - _, err := w.Write([]byte("Bad Request")) - if err != nil { - log.Error(err.Error()) - } - } - return - } - - file := strings.Replace(r.URL.Path, m[1]+"/", "", 1) - dir, err := getGitRepoPath(m[1]) - if err != nil { - log.Error(err.Error()) - ctx.NotFound("HTTPBackend", err) - return - } - - route.handler(serviceHandler{cfg, w, r, dir, file, cfg.Env}) - return - } - } - - ctx.NotFound("HTTPBackend", nil) - } -}