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:
from httpx import (
URL,
AsyncClient,
+ InvalidURL,
NotRedirectResponse,
RequestBodyUnavailable,
TooManyRedirects,
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!")
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.'