mirror of
https://github.com/valyala/fasthttp.git
synced 2026-06-26 17:46:34 +03:00
Issue #60: skip body copying in DoTimeout. This should improve DoTimeout performance when dealing with big request and/or response bodies
This commit is contained in:
@@ -862,7 +862,8 @@ func clientDoDeadlineFreeConn(req *Request, resp *Response, deadline time.Time,
|
||||
// Make req and resp copies, since on timeout they no longer
|
||||
// may be accessed.
|
||||
reqCopy := AcquireRequest()
|
||||
req.CopyTo(reqCopy)
|
||||
req.copyToSkipBody(reqCopy)
|
||||
swapRequestBody(req, reqCopy)
|
||||
respCopy := AcquireResponse()
|
||||
|
||||
// Note that the request continues execution on ErrTimeout until
|
||||
@@ -889,7 +890,8 @@ func clientDoDeadlineFreeConn(req *Request, resp *Response, deadline time.Time,
|
||||
var err error
|
||||
select {
|
||||
case err = <-ch:
|
||||
respCopy.CopyTo(resp)
|
||||
respCopy.copyToSkipBody(resp)
|
||||
swapResponseBody(resp, respCopy)
|
||||
ReleaseResponse(respCopy)
|
||||
ReleaseRequest(reqCopy)
|
||||
errorChPool.Put(chv)
|
||||
|
||||
@@ -433,9 +433,13 @@ func (req *Request) ResetBody() {
|
||||
|
||||
// CopyTo copies req contents to dst except of body stream.
|
||||
func (req *Request) CopyTo(dst *Request) {
|
||||
req.copyToSkipBody(dst)
|
||||
dst.body = append(dst.body[:0], req.body...)
|
||||
}
|
||||
|
||||
func (req *Request) copyToSkipBody(dst *Request) {
|
||||
dst.Reset()
|
||||
req.Header.CopyTo(&dst.Header)
|
||||
dst.body = append(dst.body[:0], req.body...)
|
||||
|
||||
req.uri.CopyTo(&dst.uri)
|
||||
dst.parsedURI = req.parsedURI
|
||||
@@ -449,12 +453,26 @@ func (req *Request) CopyTo(dst *Request) {
|
||||
|
||||
// CopyTo copies resp contents to dst except of body stream.
|
||||
func (resp *Response) CopyTo(dst *Response) {
|
||||
resp.copyToSkipBody(dst)
|
||||
dst.body = append(dst.body[:0], resp.body...)
|
||||
}
|
||||
|
||||
func (resp *Response) copyToSkipBody(dst *Response) {
|
||||
dst.Reset()
|
||||
resp.Header.CopyTo(&dst.Header)
|
||||
dst.body = append(dst.body[:0], resp.body...)
|
||||
dst.SkipBody = resp.SkipBody
|
||||
}
|
||||
|
||||
func swapRequestBody(a, b *Request) {
|
||||
a.body, b.body = b.body, a.body
|
||||
a.bodyStream, b.bodyStream = b.bodyStream, a.bodyStream
|
||||
}
|
||||
|
||||
func swapResponseBody(a, b *Response) {
|
||||
a.body, b.body = b.body, a.body
|
||||
a.bodyStream, b.bodyStream = b.bodyStream, a.bodyStream
|
||||
}
|
||||
|
||||
// URI returns request URI
|
||||
func (req *Request) URI() *URI {
|
||||
req.parseURI()
|
||||
|
||||
Reference in New Issue
Block a user