diff --git a/v2/pkg/protocols/http/request.go b/v2/pkg/protocols/http/request.go index 6dc361fad..ca3ffc5cb 100644 --- a/v2/pkg/protocols/http/request.go +++ b/v2/pkg/protocols/http/request.go @@ -117,7 +117,7 @@ func (r *Request) executeParallelHTTP(reqURL string, dynamicValues, previous out return requestErr } -// executeRaceRequest executes turbo http request for a URL +// executeTurboHTTP executes turbo http request for a URL func (r *Request) executeTurboHTTP(reqURL string, dynamicValues, previous output.InternalEvent, callback protocols.OutputEventCallback) error { generator := r.newGenerator() @@ -277,11 +277,15 @@ func (r *Request) executeRequest(reqURL string, request *generatedRequest, previ var hostname string timeStart := time.Now() if request.original.Pipeline { - formedURL = request.rawRequest.FullURL - if parsed, parseErr := url.Parse(formedURL); parseErr == nil { - hostname = parsed.Host + if request.rawRequest != nil { + formedURL = request.rawRequest.FullURL + if parsed, parseErr := url.Parse(formedURL); parseErr == nil { + hostname = parsed.Host + } + resp, err = request.pipelinedClient.DoRaw(request.rawRequest.Method, reqURL, request.rawRequest.Path, generators.ExpandMapValues(request.rawRequest.Headers), ioutil.NopCloser(strings.NewReader(request.rawRequest.Data))) + } else if request.request != nil { + resp, err = request.pipelinedClient.Dor(request.request) } - resp, err = request.pipelinedClient.DoRaw(request.rawRequest.Method, reqURL, request.rawRequest.Path, generators.ExpandMapValues(request.rawRequest.Headers), ioutil.NopCloser(strings.NewReader(request.rawRequest.Data))) } else if request.original.Unsafe && request.rawRequest != nil { formedURL = request.rawRequest.FullURL if parsed, parseErr := url.Parse(formedURL); parseErr == nil { @@ -343,7 +347,9 @@ func (r *Request) executeRequest(reqURL string, request *generatedRequest, previ } data, err := ioutil.ReadAll(bodyReader) if err != nil { - return errors.Wrap(err, "could not read http body") + if !strings.Contains(err.Error(), "unexpected EOF") { // ignore EOF error + return errors.Wrap(err, "could not read http body") + } } resp.Body.Close() diff --git a/v2/pkg/protocols/http/utils.go b/v2/pkg/protocols/http/utils.go index fa9747097..a2189d08d 100644 --- a/v2/pkg/protocols/http/utils.go +++ b/v2/pkg/protocols/http/utils.go @@ -3,6 +3,8 @@ package http import ( "bytes" "compress/gzip" + "compress/zlib" + "io" "io/ioutil" "net/http" "net/http/httputil" @@ -100,19 +102,23 @@ func handleDecompression(resp *http.Response, bodyOrig []byte) (bodyDec []byte, return bodyOrig, nil } - encodingHeader := strings.TrimSpace(strings.ToLower(resp.Header.Get("Content-Encoding"))) - if strings.Contains(encodingHeader, "gzip") { - gzipreader, err := gzip.NewReader(bytes.NewReader(bodyOrig)) - if err != nil { - return bodyOrig, err - } - defer gzipreader.Close() - - bodyDec, err = ioutil.ReadAll(gzipreader) - if err != nil { - return bodyOrig, err - } - return bodyDec, nil + var reader io.ReadCloser + switch resp.Header.Get("Content-Encoding") { + case "gzip": + reader, err = gzip.NewReader(resp.Body) + case "deflate": + reader, err = zlib.NewReader(resp.Body) + default: + reader = resp.Body } - return bodyOrig, nil + if err != nil { + return nil, err + } + defer reader.Close() + + bodyDec, err = ioutil.ReadAll(reader) + if err != nil { + return bodyOrig, err + } + return bodyDec, nil }