diff options
author | Unknwon <joe2010xtmf@163.com> | 2014-10-15 16:28:38 -0400 |
---|---|---|
committer | Unknwon <joe2010xtmf@163.com> | 2014-10-15 16:28:38 -0400 |
commit | 1aa12c74523680946dd220b6fc8cbe6d594b5a54 (patch) | |
tree | eb7ddfb18e6f402454ba6bdb9bec0da1f537e464 /routers | |
parent | fa241efa6d5e934f599e43714e970fa48c9a0f47 (diff) | |
download | gitea-1aa12c74523680946dd220b6fc8cbe6d594b5a54.tar.gz gitea-1aa12c74523680946dd220b6fc8cbe6d594b5a54.zip |
Fix #572
Diffstat (limited to 'routers')
-rw-r--r-- | routers/repo/http.go | 41 |
1 files changed, 31 insertions, 10 deletions
diff --git a/routers/repo/http.go b/routers/repo/http.go index 56c85bf59a..81b49bf309 100644 --- a/routers/repo/http.go +++ b/routers/repo/http.go @@ -6,6 +6,7 @@ package repo import ( "bytes" + "compress/gzip" "encoding/base64" "errors" "fmt" @@ -283,23 +284,42 @@ 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) + access := hasAccess(r, hr.Config, dir, rpc, true) if access == false { renderNoAccess(w) return } w.Header().Set("Content-Type", fmt.Sprintf("application/x-git-%s-result", rpc)) - w.WriteHeader(http.StatusOK) - var input []byte - var br io.Reader + var ( + reqBody = r.Body + input []byte + br io.Reader + err error + ) + + // Handle GZIP. + if r.Header.Get("Content-Encoding") == "gzip" { + reqBody, err = gzip.NewReader(reqBody) + if err != nil { + log.GitLogger.Error(2, "fail to create gzip reader: %v", err) + w.WriteHeader(http.StatusInternalServerError) + return + } + } + if hr.Config.OnSucceed != nil { - input, _ = ioutil.ReadAll(r.Body) + input, err = ioutil.ReadAll(reqBody) + if err != nil { + log.GitLogger.Error(2, "fail to read request body: %v", err) + w.WriteHeader(http.StatusInternalServerError) + return + } br = bytes.NewReader(input) } else { - br = r.Body + br = reqBody } args := []string{rpc, "--stateless-rpc", dir} @@ -308,15 +328,16 @@ func serviceRpc(rpc string, hr handler) { cmd.Stdout = w cmd.Stdin = br - err := cmd.Run() - if err != nil { - log.GitLogger.Error(4, err.Error()) + if err := cmd.Run(); err != nil { + log.GitLogger.Error(2, "fail to serve RPC(%s): %v", rpc, err) + w.WriteHeader(http.StatusInternalServerError) return } if hr.Config.OnSucceed != nil { hr.Config.OnSucceed(rpc, input) } + w.WriteHeader(http.StatusOK) } func getInfoRefs(hr handler) { @@ -372,7 +393,7 @@ func sendFile(contentType string, hr handler) { w, r := hr.w, hr.r reqFile := path.Join(hr.Dir, hr.File) - //fmt.Println("sendFile:", reqFile) + // fmt.Println("sendFile:", reqFile) f, err := os.Stat(reqFile) if os.IsNotExist(err) { |