[networking] Fix + decoding in SOCKS proxy credentials (#17728)

Authored by: doe1080
This commit is contained in:
doe1080
2026-09-27 20:44:21 +02:00
committed by GitHub
parent 28731cbacb
commit caf63903a1
2 changed files with 11 additions and 9 deletions
+3 -3
View File
@@ -63,13 +63,13 @@ class TestNetworkingUtils:
'username': 'user', 'username': 'user',
'password': '', 'password': '',
}), }),
('socks4://u%40ser:pa%20ss@127.0.0.1:1080', { ('socks4://u%40ser+name:pa%20ss+word@127.0.0.1:1080', {
'proxytype': ProxyType.SOCKS4, 'proxytype': ProxyType.SOCKS4,
'addr': '127.0.0.1', 'addr': '127.0.0.1',
'port': 1080, 'port': 1080,
'rdns': False, 'rdns': False,
'username': 'u@ser', 'username': 'u@ser+name',
'password': 'pa ss', 'password': 'pa ss+word',
}), }),
('socks4a://:pa%20ss@127.0.0.1', { ('socks4a://:pa%20ss@127.0.0.1', {
'proxytype': ProxyType.SOCKS4A, 'proxytype': ProxyType.SOCKS4A,
+8 -6
View File
@@ -52,25 +52,27 @@ def ssl_load_windows_store_certs(ssl_context, storename):
def make_socks_proxy_opts(socks_proxy): def make_socks_proxy_opts(socks_proxy):
url_components = urllib.parse.urlparse(socks_proxy) url_components = urllib.parse.urlparse(socks_proxy)
if url_components.scheme.lower() == 'socks5': scheme = url_components.scheme.lower()
if scheme == 'socks5':
socks_type = ProxyType.SOCKS5 socks_type = ProxyType.SOCKS5
rdns = False rdns = False
elif url_components.scheme.lower() == 'socks5h': elif scheme == 'socks5h':
socks_type = ProxyType.SOCKS5 socks_type = ProxyType.SOCKS5
rdns = True rdns = True
elif url_components.scheme.lower() == 'socks4': elif scheme == 'socks4':
socks_type = ProxyType.SOCKS4 socks_type = ProxyType.SOCKS4
rdns = False rdns = False
elif url_components.scheme.lower() == 'socks4a': elif scheme == 'socks4a':
socks_type = ProxyType.SOCKS4A socks_type = ProxyType.SOCKS4A
rdns = True rdns = True
else: else:
raise ValueError(f'Unknown SOCKS proxy version: {url_components.scheme.lower()}') raise ValueError(f'Unknown SOCKS proxy version: {scheme}')
def unquote_if_non_empty(s): def unquote_if_non_empty(s):
if not s: if not s:
return s return s
return urllib.parse.unquote_plus(s) return urllib.parse.unquote(s)
return { return {
'proxytype': socks_type, 'proxytype': socks_type,
'addr': url_components.hostname, 'addr': url_components.hostname,