@@ -195,15 +195,22 @@ func hoverflyError(req *http.Request, err error, msg string, statusCode int) *ht
195
195
196
196
// processRequest - processes incoming requests and based on proxy state (record/playback)
197
197
// returns HTTP response.
198
- func (hf * Hoverfly ) processRequest (req * http.Request ) (* http.Request , * http.Response ) {
198
+ func (hf * Hoverfly ) processRequest (req * http.Request ) * http.Response {
199
+ var response * http.Response
199
200
200
201
mode := hf .Cfg .GetMode ()
201
202
203
+ requestDetails , err := models .NewRequestDetailsFromHttpRequest (req )
204
+ if err != nil {
205
+ return hoverflyError (req , err , "Could not interpret HTTP request" , http .StatusServiceUnavailable )
206
+ }
207
+
202
208
if mode == CaptureMode {
203
- newResponse , err := hf .captureRequest (req )
209
+ var err error
210
+ response , err = hf .captureRequest (req )
204
211
205
212
if err != nil {
206
- return req , hoverflyError (req , err , "Could not capture request" , http .StatusServiceUnavailable )
213
+ return hoverflyError (req , err , "Could not capture request" , http .StatusServiceUnavailable )
207
214
}
208
215
log .WithFields (log.Fields {
209
216
"mode" : mode ,
@@ -214,13 +221,14 @@ func (hf *Hoverfly) processRequest(req *http.Request) (*http.Request, *http.Resp
214
221
"destination" : req .Host ,
215
222
}).Info ("request and response captured" )
216
223
217
- return req , newResponse
224
+ return response
218
225
219
226
} else if mode == SynthesizeMode {
220
- response , err := SynthesizeResponse (req , hf .Cfg .Middleware )
227
+ var err error
228
+ response , err = SynthesizeResponse (req , requestDetails , hf .Cfg .Middleware )
221
229
222
230
if err != nil {
223
- return req , hoverflyError (req , err , "Could not create synthetic response!" , http .StatusServiceUnavailable )
231
+ return hoverflyError (req , err , "Could not create synthetic response!" , http .StatusServiceUnavailable )
224
232
}
225
233
226
234
log .WithFields (log.Fields {
@@ -232,41 +240,32 @@ func (hf *Hoverfly) processRequest(req *http.Request) (*http.Request, *http.Resp
232
240
"destination" : req .Host ,
233
241
}).Info ("synthetic response created successfuly" )
234
242
235
- respDelay := hf .ResponseDelays .GetDelay (req .URL .String (), req .Method )
236
- if respDelay != nil {
237
- respDelay .Execute ()
238
- }
239
-
240
- return req , response
241
-
242
243
} else if mode == ModifyMode {
243
-
244
- response , err : = hf .modifyRequestResponse (req , hf .Cfg .Middleware )
244
+ var err error
245
+ response , err = hf .modifyRequestResponse (req , requestDetails , hf .Cfg .Middleware )
245
246
246
247
if err != nil {
247
248
log .WithFields (log.Fields {
248
249
"error" : err .Error (),
249
250
"middleware" : hf .Cfg .Middleware ,
250
251
}).Error ("Got error when performing request modification" )
251
- return req , hoverflyError (
252
- req ,
253
- err ,
254
- fmt .Sprintf ("Middleware (%s) failed or something else happened!" , hf .Cfg .Middleware ),
255
- http .StatusServiceUnavailable )
252
+ return hoverflyError (req , err , fmt .Sprintf ("Middleware (%s) failed or something else happened!" , hf .Cfg .Middleware ), http .StatusServiceUnavailable )
256
253
}
257
254
258
- respDelay := hf .ResponseDelays .GetDelay (req .URL .String (), req .Method )
259
- if respDelay != nil {
260
- respDelay .Execute ()
255
+ } else {
256
+ var err * matching.MatchingError
257
+ response , err = hf .getResponse (req , requestDetails )
258
+ if err != nil {
259
+ return hoverflyError (req , err , err .Error (), err .StatusCode )
261
260
}
262
-
263
- // returning modified response
264
- return req , response
265
261
}
266
262
267
- newResponse := hf .getResponse (req )
263
+ respDelay := hf .ResponseDelays .GetDelay (requestDetails )
264
+ if respDelay != nil {
265
+ respDelay .Execute ()
266
+ }
268
267
269
- return req , newResponse
268
+ return response
270
269
271
270
}
272
271
@@ -344,7 +343,7 @@ func (hf *Hoverfly) doRequest(request *http.Request) (*http.Request, *http.Respo
344
343
// middleware is provided, modifying request
345
344
var requestResponsePair models.RequestResponsePair
346
345
347
- rd , err := getRequestDetails (request )
346
+ rd , err := models . NewRequestDetailsFromHttpRequest (request )
348
347
if err != nil {
349
348
return nil , nil , err
350
349
}
@@ -404,33 +403,11 @@ func (hf *Hoverfly) doRequest(request *http.Request) (*http.Request, *http.Respo
404
403
}
405
404
406
405
// getResponse returns stored response from cache
407
- func (hf * Hoverfly ) getResponse (req * http.Request ) * http.Response {
408
-
409
- if req .Body == nil {
410
- req .Body = ioutil .NopCloser (bytes .NewBuffer ([]byte ("" )))
411
- }
412
-
413
- reqBody , err := ioutil .ReadAll (req .Body )
414
-
415
- if err != nil {
416
- log .WithFields (log.Fields {
417
- "error" : err .Error (),
418
- }).Error ("Got error when reading request body" )
419
- }
420
-
421
- requestDetails := models.RequestDetails {
422
- Path : req .URL .Path ,
423
- Method : req .Method ,
424
- Destination : req .Host ,
425
- Scheme : req .URL .Scheme ,
426
- Query : req .URL .RawQuery ,
427
- Body : string (reqBody ),
428
- Headers : req .Header ,
429
- }
406
+ func (hf * Hoverfly ) getResponse (req * http.Request , requestDetails models.RequestDetails ) (* http.Response , * matching.MatchingError ) {
430
407
431
408
responseDetails , matchErr := hf .RequestMatcher .GetResponse (& requestDetails )
432
409
if matchErr != nil {
433
- return hoverflyError ( req , matchErr , matchErr . Error (), matchErr . StatusCode )
410
+ return nil , matchErr
434
411
}
435
412
436
413
pair := & models.RequestResponsePair {
@@ -443,27 +420,12 @@ func (hf *Hoverfly) getResponse(req *http.Request) *http.Response {
443
420
_ = c .ApplyMiddleware (hf .Cfg .Middleware )
444
421
}
445
422
446
- respDelay := hf .ResponseDelays .GetDelay (req .URL .String (), req .Method )
447
- if respDelay != nil {
448
- respDelay .Execute ()
449
- }
450
-
451
- return c .ReconstructResponse ()
423
+ return c .ReconstructResponse (), nil
452
424
}
453
425
454
426
// modifyRequestResponse modifies outgoing request and then modifies incoming response, neither request nor response
455
427
// is saved to cache.
456
- func (hf * Hoverfly ) modifyRequestResponse (req * http.Request , middleware string ) (* http.Response , error ) {
457
-
458
- // getting request details
459
- rd , err := getRequestDetails (req )
460
- if err != nil {
461
- log .WithFields (log.Fields {
462
- "error" : err .Error (),
463
- "middleware" : middleware ,
464
- }).Error ("Failed to get request details" )
465
- return nil , err
466
- }
428
+ func (hf * Hoverfly ) modifyRequestResponse (req * http.Request , requestDetails models.RequestDetails , middleware string ) (* http.Response , error ) {
467
429
468
430
// modifying request
469
431
req , resp , err := hf .doRequest (req )
@@ -489,7 +451,7 @@ func (hf *Hoverfly) modifyRequestResponse(req *http.Request, middleware string)
489
451
Headers : resp .Header ,
490
452
}
491
453
492
- requestResponsePair := models.RequestResponsePair {Response : r , Request : rd }
454
+ requestResponsePair := models.RequestResponsePair {Response : r , Request : requestDetails }
493
455
494
456
c := NewConstructor (req , requestResponsePair )
495
457
// applying middleware to modify response
0 commit comments