Comments (7)
Are we talking about a server handler or a client response?
from fasthttp.
Server handler
Groetjes,
from fasthttp.
I think this is good feature, for some server applications that handle large of requests and the buffer was cached, using SetBodyRaw
to get high performance but currently, will unsafe release the buffer.
Quick to workaround push the buffer that need release into batcher and process in the after.
If support callback or closer interface,... when write the response body completed get will helpful in this case.
from fasthttp.
I've looked at the code for a bit and I think that my use-case is satisfied by using SetBodyStream()
and passing an io.Closer, which gets called when I can free my underlying data.
As far as I can see (by reading the source) both cause exactly one copy when my data gets copied into the writeBuffer to be sent to the client.
Would that work for you too @pisken?
from fasthttp.
I see SetBodyStream
not resolve for large of requests when data body available (caching), and SetBodyRaw
can resolve for this case.
In this case large of request and data body response was cached, I need write body direct to connection client, no copy to other buffer to keep low memory and cpu used.
from fasthttp.
AAUI it actually copies in exactly the same scenarios.
There is always a *bufio.Writer (managed by a sync.Pool): https://github.com/valyala/fasthttp/blob/master/server.go#L2407 So during the writing of the request, that memory is allocated.
Write gets that *bufio.Writer which already has the headers written to it.
bodyBytes returns the []byte that you passed to SetBodyRaw, and then writes it to the *bufio.Writer. Unless 1) the *bufio.Writer is empty, and 2) your []byte is larger than its size, it'll copy the data.
You can ensure the buffer is empty by setting ImmediateHeaderFlush on the response, but that's at the cost of an extra syscall (for non-HTTPS), which might or might not be more expensive than copying the bytes.
For SetBodyStream (assuming you've set the contentLength), you'll end up in writeBodyStream here which will call io.CopyBuffer(), which will call YourBodyStream.WriteTo, which can do a single large write, just like the SetBodyRaw case.
from fasthttp.
Sounds like a good idea, a pull request is welcome!
from fasthttp.
Related Issues (20)
- CloseOnShutdown dont work? HOT 3
- how can i use fasthttp bare minimum "net" library only without routing through the http overhead? just pure tcp rpc stuff will do HOT 1
- What is a correct way to create a proper fasthttp.RequestCtx in the unit tests? HOT 1
- Timeout stream response connection does not clear buffer data for re-use HOT 2
- Propagate request error to RetryIfFunc HOT 1
- Expose `timeout` field in Request HOT 1
- NewFastHTTPHandler does not set response status code. HOT 1
- NewFastHTTPHandler does not set response status code HOT 7
- Error when serving connection "x.x.x.x:443"<->"172.56.198.126:18271": EOF HOT 3
- http parsing of the request line - where does that happen? HOT 1
- gnet is going to have tls working on it very soon. was wondering if anyone has tried to port fasthttp to use gnet instead. HOT 1
- Feature request : update and show all examples for doing zero allocation when using fasthttp. 100% zero alloc for each req / resp. HOT 3
- It is not safe to read all stream body to memory without a max size limit. HOT 1
- serving a compress enabled public folder without +w permissions results in a 404 HOT 1
- no free connections available to host HOT 3
- when setting MaxConnsPerIP to value greater than zero, the TLSConnectionState( ) is null on a TLS connection returned from the worker pool. HOT 11
- invalid memory address or nil pointer dereference for firstByteReader'c HOT 2
- peeking nested query args HOT 1
- Incorrect Tag for version 1.54.0 HOT 1
- PFlag/Cobra compatibility in prefork HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from fasthttp.