From f3730d5454e3167c4b2e9432612324044454e5bd Mon Sep 17 00:00:00 2001 From: Julian Dolce Date: Fri, 8 Dec 2023 16:46:22 -0500 Subject: [PATCH] fix: do not set query string on request retries --- pagerduty/pagerduty.go | 4 ++-- pagerduty/pagerduty_test.go | 44 +++++++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 2 deletions(-) diff --git a/pagerduty/pagerduty.go b/pagerduty/pagerduty.go index 0c3aef5..79991e3 100644 --- a/pagerduty/pagerduty.go +++ b/pagerduty/pagerduty.go @@ -336,7 +336,7 @@ func (c *Client) newRequestDoContext(ctx context.Context, method, url string, qr resp, err := c.do(req, v) if err != nil { if respErr, ok := err.(*Error); ok && respErr.needToRetry { - return c.newRequestDoContext(ctx, method, url, qryOptions, body, v) + return c.newRequestDoContext(ctx, method, url, nil, body, v) } return nil, err @@ -368,7 +368,7 @@ func (c *Client) newRequestDoOptionsContext(ctx context.Context, method, url str resp, err := c.do(req, v) if err != nil { if respErr, ok := err.(*Error); ok && respErr.needToRetry { - return c.newRequestDoOptionsContext(ctx, method, url, qryOptions, body, v) + return c.newRequestDoOptionsContext(ctx, method, url, nil, body, v) } return nil, err diff --git a/pagerduty/pagerduty_test.go b/pagerduty/pagerduty_test.go index 5d52e73..5f08ff2 100644 --- a/pagerduty/pagerduty_test.go +++ b/pagerduty/pagerduty_test.go @@ -2,6 +2,7 @@ package pagerduty import ( "bytes" + "context" "net/http" "net/http/httptest" "strings" @@ -100,3 +101,46 @@ func TestClientUserAgentOverwritten(t *testing.T) { t.Errorf("got %q, want %q", client.Config.UserAgent, newUserAgent) } } + +func TestRetryURL(t *testing.T) { + + setup() + defer teardown() + + timesCalled := 0 + expectedURL := "/members?offset=100" + + options := GetMembersOptions{ + Offset: 100, + } + + mux.HandleFunc("/members", func(w http.ResponseWriter, r *http.Request) { + timesCalled++ + testMethod(t, r, "GET") + url := r.URL.String() + if url != expectedURL { + t.Fatalf("Request url: %v, want %v", url, expectedURL) + } + + if timesCalled > 1 { + w.WriteHeader(http.StatusOK) + return + } + + w.Header().Set("Ratelimit-Reset", "1") + w.WriteHeader(http.StatusTooManyRequests) + w.Write([]byte(`{"error":{"code":"2020", "message":"Rate Limit Exceeded"}}`)) + + }) + + _, err := client.newRequestDoOptionsContext(context.Background(), http.MethodGet, "/members", options, nil, nil) + if err != nil { + t.Fatalf(err.Error()) + } + + timesCalled = 0 + _, err = client.newRequestDoContext(context.Background(), http.MethodGet, "/members", options, nil, nil) + if err != nil { + t.Fatalf(err.Error()) + } +}