diff --git a/exchanges/request/request.go b/exchanges/request/request.go index 1cc69de4..83e95322 100644 --- a/exchanges/request/request.go +++ b/exchanges/request/request.go @@ -83,6 +83,12 @@ func (i *Item) validateRequest(ctx context.Context, r *Requester) (*http.Request return nil, errors.New("invalid path") } + if i.HeaderResponse != nil { + if *i.HeaderResponse == nil { + return nil, errors.New("header response is nil") + } + } + req, err := http.NewRequestWithContext(ctx, i.Method, i.Path, i.Body) if err != nil { return nil, err @@ -200,6 +206,12 @@ func (r *Requester) doRequest(req *http.Request, p *Item) error { } } + if p.HeaderResponse != nil { + for k, v := range resp.Header { + (*p.HeaderResponse)[k] = v + } + } + if resp.StatusCode < http.StatusOK || resp.StatusCode > http.StatusAccepted { return fmt.Errorf("%s unsuccessful HTTP status code: %d raw response: %s", diff --git a/exchanges/request/request_test.go b/exchanges/request/request_test.go index 0f376310..1966e74e 100644 --- a/exchanges/request/request_test.go +++ b/exchanges/request/request_test.go @@ -144,6 +144,14 @@ func TestCheckRequest(t *testing.T) { t.Fatal(err) } + var passback http.Header + check.HeaderResponse = &passback + _, err = check.validateRequest(ctx, r) + if err == nil { + t.Fatal("expected error when underlying memory is not allocated") + } + passback = http.Header{} + // Test setting headers check.Headers = map[string]string{ "Content-Type": "Super awesome HTTP party experience", @@ -278,11 +286,15 @@ func TestDoRequest(t *testing.T) { var resp struct { Response bool `json:"response"` } + + // Check header contents + var passback = http.Header{} err = r.SendPayload(ctx, &Item{ - Method: http.MethodGet, - Path: testURL, - Result: &resp, - Endpoint: UnAuth, + Method: http.MethodGet, + Path: testURL, + Result: &resp, + Endpoint: UnAuth, + HeaderResponse: &passback, }) if err != nil { t.Fatal(err) @@ -291,6 +303,14 @@ func TestDoRequest(t *testing.T) { t.Fatal(unexpected) } + if passback.Get("Content-Length") != "17" { + t.Fatal("incorrect header value") + } + + if passback.Get("Content-Type") != "application/json" { + t.Fatal("incorrect header value") + } + // Check error var respErr struct { Error bool `json:"error"` diff --git a/exchanges/request/request_types.go b/exchanges/request/request_types.go index e8b43a67..ba6745fd 100644 --- a/exchanges/request/request_types.go +++ b/exchanges/request/request_types.go @@ -53,7 +53,10 @@ type Item struct { HTTPDebugging bool HTTPRecording bool IsReserved bool - Endpoint EndpointLimit + // HeaderResponse for inspection of header contents package side useful for + // pagination + HeaderResponse *http.Header + Endpoint EndpointLimit } // Backoff determines how long to wait between request attempts.