Skip to content

Commit 81c5bf1

Browse files
committed
Refine redirect guardrails
1 parent 595eb4e commit 81c5bf1

2 files changed

Lines changed: 7 additions & 2 deletions

File tree

client/transport.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -271,10 +271,11 @@ type redirectClient interface {
271271
func doRedirectsWithClient(req *fasthttp.Request, resp *fasthttp.Response, maxRedirects int, client redirectClient) error {
272272
currentURL := req.URI().String()
273273
redirects := 0
274-
originalLimit := maxRedirects
274+
singleRequestOnly := maxRedirects <= 0
275275

276276
if maxRedirects < 0 {
277277
maxRedirects = defaultRedirectLimit
278+
singleRequestOnly = false
278279
}
279280

280281
for {
@@ -289,7 +290,7 @@ func doRedirectsWithClient(req *fasthttp.Request, resp *fasthttp.Response, maxRe
289290
return nil
290291
}
291292

292-
if originalLimit == 0 {
293+
if singleRequestOnly {
293294
return nil
294295
}
295296

@@ -312,6 +313,7 @@ func doRedirectsWithClient(req *fasthttp.Request, resp *fasthttp.Response, maxRe
312313
if req.Header.IsPost() && (statusCode == fasthttp.StatusMovedPermanently || statusCode == fasthttp.StatusFound) {
313314
req.Header.SetMethod(fasthttp.MethodGet)
314315
req.SetBody(nil)
316+
req.Header.Del(fasthttp.HeaderContentType)
315317
}
316318
}
317319
}

client/transport_test.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -299,13 +299,15 @@ func TestDoRedirectsWithClientBranches(t *testing.T) {
299299

300300
req.SetRequestURI("http://example.com/start")
301301
req.Header.SetMethod(fasthttp.MethodPost)
302+
req.Header.SetContentType("application/json")
302303
req.SetBodyString("payload")
303304

304305
client := &stubRedirectClient{calls: []stubRedirectCall{{status: ptrInt(fasthttp.StatusMovedPermanently), location: ptrString("/redirect")}, {status: ptrInt(fasthttp.StatusOK)}}}
305306
require.NoError(t, doRedirectsWithClient(req, resp, -1, client))
306307
require.Equal(t, fasthttp.MethodGet, string(req.Header.Method()))
307308
require.Equal(t, "http://example.com/redirect", req.URI().String())
308309
require.Empty(t, req.Body())
310+
require.Len(t, req.Header.ContentType(), 0)
309311

310312
resp.Reset()
311313
req.Header.SetMethod(fasthttp.MethodPost)
@@ -319,6 +321,7 @@ func TestDoRedirectsWithClientBranches(t *testing.T) {
319321
require.Equal(t, "http://example.com/again", req.URI().String())
320322
require.Equal(t, "payload", string(req.Body()))
321323
require.Equal(t, 1, singleCall.CallCount())
324+
require.Equal(t, fasthttp.StatusFound, resp.Header.StatusCode())
322325

323326
resp.Reset()
324327
req.Header.SetMethod(fasthttp.MethodPost)

0 commit comments

Comments
 (0)