Skip to content

Commit 3236b70

Browse files
author
Nicolas Surribas
committed
fix: Do not raise exception for invalid redirect URLs
1 parent def4778 commit 3236b70

2 files changed

Lines changed: 26 additions & 10 deletions

File tree

httpx/_client.py

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -985,13 +985,18 @@ def _send_handling_redirects(
985985
if not response.has_redirect_location:
986986
return response
987987

988-
request = self._build_redirect_request(request, response)
988+
try:
989+
next_request = self._build_redirect_request(request, response)
990+
except (InvalidURL, RemoteProtocolError):
991+
return response
992+
989993
history = history + [response]
990994

991995
if follow_redirects:
992996
response.read()
997+
request = next_request
993998
else:
994-
response.next_request = request
999+
response.next_request = next_request
9951000
return response
9961001

9971002
except BaseException as exc:
@@ -1701,13 +1706,18 @@ async def _send_handling_redirects(
17011706
if not response.has_redirect_location:
17021707
return response
17031708

1704-
request = self._build_redirect_request(request, response)
1709+
try:
1710+
next_request = self._build_redirect_request(request, response)
1711+
except (InvalidURL, RemoteProtocolError):
1712+
return response
1713+
17051714
history = history + [response]
17061715

17071716
if follow_redirects:
17081717
await response.aread()
1718+
request = next_request
17091719
else:
1710-
response.next_request = request
1720+
response.next_request = next_request
17111721
return response
17121722

17131723
except BaseException as exc:

tests/client/test_redirects.py

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -202,8 +202,11 @@ def test_malformed_redirect():
202202

203203
def test_invalid_redirect():
204204
client = httpx.Client(transport=httpx.MockTransport(redirects))
205-
with pytest.raises(httpx.RemoteProtocolError):
206-
client.get("http://example.org/invalid_redirect", follow_redirects=True)
205+
response = client.get("http://example.org/invalid_redirect", follow_redirects=True)
206+
assert response.status_code == httpx.codes.SEE_OTHER
207+
assert response.url == "http://example.org/invalid_redirect"
208+
assert not response.history
209+
assert response.next_request is None
207210

208211

209212
def test_no_scheme_redirect():
@@ -441,7 +444,10 @@ def test_redirect_custom_scheme():
441444
@pytest.mark.anyio
442445
async def test_async_invalid_redirect():
443446
async with httpx.AsyncClient(transport=httpx.MockTransport(redirects)) as client:
444-
with pytest.raises(httpx.RemoteProtocolError):
445-
await client.get(
446-
"http://example.org/invalid_redirect", follow_redirects=True
447-
)
447+
response = await client.get(
448+
"http://example.org/invalid_redirect", follow_redirects=True
449+
)
450+
assert response.status_code == httpx.codes.SEE_OTHER
451+
assert response.url == "http://example.org/invalid_redirect"
452+
assert not response.history
453+
assert response.next_request is None

0 commit comments

Comments
 (0)