Skip to content
This repository has been archived by the owner on Sep 24, 2020. It is now read-only.

Commit

Permalink
Improve error when redirecting with custom schemes
Browse files Browse the repository at this point in the history
  • Loading branch information
jcugat committed May 27, 2020
1 parent f5e1aa5 commit 9160631
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 0 deletions.
4 changes: 4 additions & 0 deletions httpx/_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -322,6 +322,10 @@ def redirect_url(self, request: Request, response: Response) -> URL:

url = URL(location, allow_relative=True)

# Check that we can handle the scheme
if url.scheme and url.scheme not in ("http", "https"):
raise InvalidURL(f'Scheme "{url.scheme}" not supported.')

# Handle malformed 'Location' headers that are "absolute" form, have no host.
# See: https://github.com/encode/httpx/issues/771
if url.scheme and not url.host:
Expand Down
20 changes: 20 additions & 0 deletions tests/client/test_redirects.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
from httpx import (
URL,
AsyncClient,
InvalidURL,
NotRedirectResponse,
RequestBodyUnavailable,
TooManyRedirects,
Expand Down Expand Up @@ -140,6 +141,17 @@ async def body():
else:
return b"HTTP/1.1", 200, b"OK", [], ByteStream(b"Hello, world!")

elif path == b"/redirect_custom_scheme":
status_code = codes.MOVED_PERMANENTLY
headers = [(b"location", b"market://details?id=42")]
return (
b"HTTP/1.1",
status_code,
b"Moved Permanently",
headers,
ByteStream(b""),
)

return b"HTTP/1.1", 200, b"OK", [], ByteStream(b"Hello, world!")


Expand Down Expand Up @@ -431,3 +443,11 @@ async def test_redirect_cookie_behavior():
response = await client.get("https://example.com/")
assert response.url == "https://example.com/"
assert response.text == "Not logged in"


@pytest.mark.usefixtures("async_environment")
async def test_redirect_custom_scheme():
client = AsyncClient(dispatch=MockDispatch())
with pytest.raises(InvalidURL) as e:
await client.post("https://example.org/redirect_custom_scheme")
assert str(e.value) == 'Scheme "market" not supported.'

0 comments on commit 9160631

Please sign in to comment.