Browse Source

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
pull/3981/head
typeless 8 years ago committed by 无闻
parent
commit
cdedc2d188
  1. 15
      routers/repo/http.go

15
routers/repo/http.go

@ -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()
br = bytes.NewReader(input)
_, 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 = tmpfile
} else {
br = reqBody
}

Loading…
Cancel
Save