Skip to content

Commit

Permalink
add socks5h proxy support
Browse files Browse the repository at this point in the history
In some case socks5h is needed to resolve the hostname.

Signed-off-by: bin liu <liubin0329@gmail.com>
  • Loading branch information
liubin committed Apr 25, 2024
1 parent 4b85e6c commit 616a2fe
Show file tree
Hide file tree
Showing 3 changed files with 14 additions and 13 deletions.
2 changes: 1 addition & 1 deletion httpx/_config.py
Expand Up @@ -334,7 +334,7 @@ def __init__(
url = URL(url)
headers = Headers(headers)

if url.scheme not in ("http", "https", "socks5"):
if url.scheme not in ("http", "https", "socks5", "socks5h"):
raise ValueError(f"Unknown scheme for proxy URL {url!r}")

if url.username or url.password:
Expand Down
8 changes: 4 additions & 4 deletions httpx/_transports/default.py
Expand Up @@ -171,7 +171,7 @@ def __init__(
http2=http2,
socket_options=socket_options,
)
elif proxy.url.scheme == "socks5":
elif proxy.url.scheme in ("socks5", "socks5h"):
try:
import socksio # noqa
except ImportError: # pragma: no cover
Expand All @@ -197,7 +197,7 @@ def __init__(
)
else: # pragma: no cover
raise ValueError(
"Proxy protocol must be either 'http', 'https', or 'socks5',"
"Proxy protocol must be either 'http', 'https', 'socks5', or 'socks5h',"
f" but got {proxy.url.scheme!r}."
)

Expand Down Expand Up @@ -311,7 +311,7 @@ def __init__(
http2=http2,
socket_options=socket_options,
)
elif proxy.url.scheme == "socks5":
elif proxy.url.scheme in ("socks5", "socks5h"):
try:
import socksio # noqa
except ImportError: # pragma: no cover
Expand All @@ -337,7 +337,7 @@ def __init__(
)
else: # pragma: no cover
raise ValueError(
"Proxy protocol must be either 'http', 'https', or 'socks5',"
"Proxy protocol must be either 'http', 'https', 'socks5', or 'socks5h',"
" but got {proxy.url.scheme!r}."
)

Expand Down
17 changes: 9 additions & 8 deletions tests/client/test_proxies.py
Expand Up @@ -67,15 +67,16 @@ def test_socks_proxy_deprecated():
def test_socks_proxy():
url = httpx.URL("http://www.example.com")

client = httpx.Client(proxy="socks5://localhost/")
transport = client._transport_for_url(url)
assert isinstance(transport, httpx.HTTPTransport)
assert isinstance(transport._pool, httpcore.SOCKSProxy)
for proxy in ("socks5://localhost/", "socks5h://localhost/"):
client = httpx.Client(proxy=proxy)
transport = client._transport_for_url(url)
assert isinstance(transport, httpx.HTTPTransport)
assert isinstance(transport._pool, httpcore.SOCKSProxy)

async_client = httpx.AsyncClient(proxy="socks5://localhost/")
async_transport = async_client._transport_for_url(url)
assert isinstance(async_transport, httpx.AsyncHTTPTransport)
assert isinstance(async_transport._pool, httpcore.AsyncSOCKSProxy)
async_client = httpx.AsyncClient(proxy=proxy)
async_transport = async_client._transport_for_url(url)
assert isinstance(async_transport, httpx.AsyncHTTPTransport)
assert isinstance(async_transport._pool, httpcore.AsyncSOCKSProxy)


PROXY_URL = "http://[::1]"
Expand Down

0 comments on commit 616a2fe

Please sign in to comment.