diff options
author | Unknwon <u@gogs.io> | 2015-03-12 01:15:01 -0400 |
---|---|---|
committer | Unknwon <u@gogs.io> | 2015-03-12 01:15:01 -0400 |
commit | 4aafeace230a35e80fb443739c2642d23fc93e51 (patch) | |
tree | 3dc6b008a4469232521ecf834b43acf17ae439dc /routers | |
parent | 34102f788945b1c73a845f7916d01d216baa56ad (diff) | |
download | gitea-4aafeace230a35e80fb443739c2642d23fc93e51.tar.gz gitea-4aafeace230a35e80fb443739c2642d23fc93e51.zip |
fix HTTP/HTTPS push update func call panic #1037 and `http: multiple response.WriteHeader calls`
Diffstat (limited to 'routers')
-rw-r--r-- | routers/repo/http.go | 45 |
1 files changed, 24 insertions, 21 deletions
diff --git a/routers/repo/http.go b/routers/repo/http.go index 3cfc065999..f5dc00b8df 100644 --- a/routers/repo/http.go +++ b/routers/repo/http.go @@ -105,7 +105,7 @@ func Http(ctx *middleware.Context) { return } - authUser, err := models.UserSignIn(authUsername, authPasswd) + authUser, err = models.UserSignIn(authUsername, authPasswd) if err != nil { if err != models.ErrUserNotExist { ctx.Handle(500, "UserSignIn error: %v", err) @@ -160,7 +160,7 @@ func Http(ctx *middleware.Context) { } } - var f = func(rpc string, input []byte) { + callback := func(rpc string, input []byte) { if rpc == "receive-pack" { var lastLine int64 = 0 @@ -189,6 +189,7 @@ func Http(ctx *middleware.Context) { newCommitId := fields[1] refName := fields[2] + // FIXME: handle error. models.Update(refName, oldCommitId, newCommitId, authUsername, username, reponame, authUser.Id) } lastLine = lastLine + size @@ -199,25 +200,23 @@ func Http(ctx *middleware.Context) { } } - config := Config{setting.RepoRootPath, "git", true, true, f} + HTTPBackend(&Config{ + RepoRootPath: setting.RepoRootPath, + GitBinPath: "git", + UploadPack: true, + ReceivePack: true, + OnSucceed: callback, + })(ctx.Resp, ctx.Req.Request) - handler := HttpBackend(&config) - handler(ctx.Resp, ctx.Req.Request) runtime.GC() } -type route struct { - cr *regexp.Regexp - method string - handler func(handler) -} - type Config struct { - ReposRoot string - GitBinPath string - UploadPack bool - ReceivePack bool - OnSucceed func(rpc string, input []byte) + RepoRootPath string + GitBinPath string + UploadPack bool + ReceivePack bool + OnSucceed func(rpc string, input []byte) } type handler struct { @@ -228,6 +227,12 @@ type handler struct { File string } +type route struct { + cr *regexp.Regexp + method string + handler func(handler) +} + var routes = []route{ {regexp.MustCompile("(.*?)/git-upload-pack$"), "POST", serviceUploadPack}, {regexp.MustCompile("(.*?)/git-receive-pack$"), "POST", serviceReceivePack}, @@ -243,7 +248,7 @@ var routes = []route{ } // Request handling function -func HttpBackend(config *Config) http.HandlerFunc { +func HTTPBackend(config *Config) 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 @@ -285,8 +290,7 @@ func serviceReceivePack(hr handler) { func serviceRpc(rpc string, hr handler) { w, r, dir := hr.w, hr.r, hr.Dir - access := hasAccess(r, hr.Config, dir, rpc, true) - if access == false { + if !hasAccess(r, hr.Config, dir, rpc, true) { renderNoAccess(w) return } @@ -337,7 +341,6 @@ func serviceRpc(rpc string, hr handler) { if hr.Config.OnSucceed != nil { hr.Config.OnSucceed(rpc, input) } - w.WriteHeader(http.StatusOK) } func getInfoRefs(hr handler) { @@ -408,7 +411,7 @@ func sendFile(contentType string, hr handler) { } func getGitDir(config *Config, fPath string) (string, error) { - root := config.ReposRoot + root := config.RepoRootPath if root == "" { cwd, err := os.Getwd() |