Use temporary file to avoid out-of-memory when receiving big chunks. (#3748)

* Use temporary file to avoid out-of-memory when receiving big chunk.

Not perfect but I think it's a reasonable solution.
For small request bodies, I suppose performance wouldn't be an issue.
For large ones, this seems to be a necessary evil.

* Must close the open file to avoid fd leaks
This commit is contained in:
typeless 2016-12-24 08:50:12 +08:00 committed by 无闻
parent 42a3bbb0f4
commit cdedc2d188

View File

@ -364,14 +364,23 @@ func serviceRPC(h serviceHandler, service string) {
}
if h.cfg.OnSucceed != nil {
input, err = ioutil.ReadAll(reqBody)
tmpfile, err := ioutil.TempFile("", "gogs")
if err != nil {
log.GitLogger.Error(2, "fail to read request body: %v", err)
log.GitLogger.Error(2, "fail to create temporary file: %v", err)
h.w.WriteHeader(http.StatusInternalServerError)
return
}
defer os.Remove(tmpfile.Name())
defer tmpfile.Close()
_, err = io.Copy(tmpfile, reqBody)
if err != nil {
log.GitLogger.Error(2, "fail to save request body: %v", err)
h.w.WriteHeader(http.StatusInternalServerError)
return
}
br = bytes.NewReader(input)
br = tmpfile
} else {
br = reqBody
}