valyala / fasthttp

Fast HTTP package for Go. Tuned for high performance. Zero memory allocations in hot paths. Up to 10x faster than net/http
MIT License
21.94k stars 1.76k forks source link

Reuse body for response #1811

Open megashchik opened 4 months ago

megashchik commented 4 months ago

Greetings!

I have the following problem I have a fairly heavy query, the answer to which takes up a lot of space I would like to reuse the buffer for it This can be done via fasthttp.Post, but you cannot insert a complex request with headers there

It seems like the solution would be something like this

 req := fasthttp.AcquireRequest()
 resp := fasthttp.AcquireResponse()
 defer fasthttp.ReleaseRequest(req)
 defer fasthttp.ReleaseResponse(resp)
 // set headers
 resp.KeepBodyBuffer = true
 err = fasthttp.Do(req, resp)
 if err != nil {
   return err
 }
 resp.KeepBodyBuffer = false
 ...

However, the keepBodyBuffer field is private

erikdubbelboer commented 4 months ago

Why do you want to set keepBodyBuffer to true? Without it memory is also reused, just between different requests using a pool.

megashchik commented 4 months ago

Because I want to use the same big buffer for the response And after removing it, because such a call rarely works and I don't want a large buffer to end up in the pool I have a method call where I am asking for a large amount of data still in large chunks

erikdubbelboer commented 4 months ago

So you want to keep reusing the fasthttp.Response multiple times for this heavy call, without calling fasthttp.ReleaseResponse(resp)? Because you have other light calls that you don't want to get mixed up with this heavy call?

If that is the case I understand and I would be open to a pull request that makes KeepBodyBuffer public with some good documentation.