55package fasthttp
66
77import (
8- "bytes"
9- "io"
108 "io/ioutil"
119 "net/http"
10+ "strings"
1211
1312 "github.com/valyala/fasthttp"
1413)
@@ -22,8 +21,13 @@ type Transport struct{}
2221//
2322func (t * Transport ) RoundTrip (req * http.Request ) (* http.Response , error ) {
2423 freq := fasthttp .AcquireRequest ()
24+ defer fasthttp .ReleaseRequest (freq )
25+
2526 fres := fasthttp .AcquireResponse ()
27+ defer fasthttp .ReleaseResponse (fres )
28+
2629 t .copyRequest (freq , req )
30+
2731 err := fasthttp .Do (freq , fres )
2832 if err != nil {
2933 return nil , err
@@ -35,11 +39,9 @@ func (t *Transport) RoundTrip(req *http.Request) (*http.Response, error) {
3539 return res , nil
3640}
3741
38- // copyRequest converts http.Request to fasthttp.Request
42+ // copyRequest converts a http.Request to fasthttp.Request
3943//
4044func (t * Transport ) copyRequest (dst * fasthttp.Request , src * http.Request ) * fasthttp.Request {
41- dst .Reset ()
42-
4345 dst .SetHost (src .Host )
4446 dst .SetRequestURI (src .URL .String ())
4547
@@ -53,16 +55,13 @@ func (t *Transport) copyRequest(dst *fasthttp.Request, src *http.Request) *fasth
5355 }
5456
5557 if src .Body != nil {
56- var b bytes.Buffer
57- io .Copy (& b , src .Body )
58-
59- dst .SetBody (b .Bytes ())
58+ dst .SetBodyStream (src .Body , - 1 )
6059 }
6160
6261 return dst
6362}
6463
65- // copyResponse converts http.Response to fasthttp.Response
64+ // copyResponse converts a http.Response to fasthttp.Response
6665//
6766func (t * Transport ) copyResponse (dst * http.Response , src * fasthttp.Response ) * http.Response {
6867 dst .StatusCode = src .StatusCode ()
@@ -71,9 +70,9 @@ func (t *Transport) copyResponse(dst *http.Response, src *fasthttp.Response) *ht
7170 dst .Header .Set (string (k ), string (v ))
7271 })
7372
74- if src .Body != nil {
75- dst . Body = ioutil . NopCloser ( bytes . NewReader ( src . Body ()))
76- }
73+ // Cast to a string to make a copy seeing as src.Body() won't
74+ // be valid after the response is released back to the pool (fasthttp.ReleaseResponse).
75+ dst . Body = ioutil . NopCloser ( strings . NewReader ( string ( src . Body ())))
7776
7877 return dst
7978}
0 commit comments