// doRequest performs original request and returns response that should be returned to client and error (if there is one) func (hf *Hoverfly) doRequest(request *http.Request) (*http.Request, *http.Response, error) { // We can't have this set. And it only contains "/pkg/net/http/" anyway request.RequestURI = "" if hf.Cfg.Middleware.FullCommand != "" { // middleware is provided, modifying request var requestResponsePair models.RequestResponsePair rd, err := models.NewRequestDetailsFromHttpRequest(request) if err != nil { return nil, nil, err } requestResponsePair.Request = rd c := NewConstructor(request, requestResponsePair) err = c.ApplyMiddleware(&hf.Cfg.Middleware) if err != nil { log.WithFields(log.Fields{ "mode": hf.Cfg.Mode, "error": err.Error(), "host": request.Host, "method": request.Method, "path": request.URL.Path, }).Error("could not forward request, middleware failed to modify request.") return nil, nil, err } request, err = c.ReconstructRequest() if err != nil { return nil, nil, err } } requestBody, _ := ioutil.ReadAll(request.Body) request.Body = ioutil.NopCloser(bytes.NewReader(requestBody)) resp, err := hf.HTTP.Do(request) request.Body = ioutil.NopCloser(bytes.NewReader(requestBody)) if err != nil { log.WithFields(log.Fields{ "mode": hf.Cfg.Mode, "error": err.Error(), "host": request.Host, "method": request.Method, "path": request.URL.Path, }).Error("could not forward request, failed to do an HTTP request.") return nil, nil, err } log.WithFields(log.Fields{ "mode": hf.Cfg.Mode, "host": request.Host, "method": request.Method, "path": request.URL.Path, }).Debug("response from external service got successfuly!") resp.Header.Set("hoverfly", "Was-Here") return request, resp, nil }