Improve error when redirecting with custom schemes (#1002)

Fixes #822
This commit is contained in:
Josep Cugat 2020-05-28 13:11:17 +02:00 committed by GitHub
parent 21d7e16559
commit 093cb42500
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 24 additions and 0 deletions

View File

@ -322,6 +322,10 @@ class BaseClient:
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:

View File

@ -8,6 +8,7 @@ import pytest
from httpx import (
URL,
AsyncClient,
InvalidURL,
NotRedirectResponse,
RequestBodyUnavailable,
TooManyRedirects,
@ -140,6 +141,17 @@ class MockDispatch(httpcore.AsyncHTTPTransport):
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!")
@ -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.'