Skip to content

Commit 55427b0

Browse files
authored
Merge pull request #18 from proxymesh/fix/urllib3-proxy-url-auth
fix(urllib3): Proxy-Authorization from proxy URL credentials
2 parents fe6ee9d + e174d1a commit 55427b0

1 file changed

Lines changed: 18 additions & 0 deletions

File tree

python_proxy_headers/urllib3_proxy_manager.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
from urllib3.connection import HTTPSConnection
44
from urllib3.connectionpool import HTTPConnectionPool, HTTPSConnectionPool
55
from urllib3.poolmanager import ProxyManager
6+
from urllib3.util.request import make_headers
7+
from urllib3.util.url import parse_url
68

79
if sys.version_info < (3, 12, 0):
810
#####################################
@@ -128,6 +130,22 @@ def urlopen(self, *args, **kwargs):
128130

129131
class ProxyHeaderManager(ProxyManager):
130132
def __init__(self, *args, **kwargs):
133+
# urllib3.ProxyManager does not add Proxy-Authorization from user:pass in the
134+
# proxy URL; requests does via HTTPAdapter.proxy_headers(). Merge URL auth here
135+
# so direct proxy_from_url() matches requests and authenticates CONNECT.
136+
proxy_url = kwargs.get("proxy_url")
137+
if proxy_url is None and args:
138+
proxy_url = args[0]
139+
proxy_headers = kwargs.get("proxy_headers")
140+
merged = dict(proxy_headers or {})
141+
if isinstance(proxy_url, str):
142+
parsed = parse_url(proxy_url)
143+
if parsed.auth and not any(
144+
k.lower() == "proxy-authorization" for k in merged
145+
):
146+
merged.update(make_headers(proxy_basic_auth=parsed.auth))
147+
if merged != dict(proxy_headers or {}):
148+
kwargs["proxy_headers"] = merged
131149
super().__init__(*args, **kwargs)
132150
self.pool_classes_by_scheme = {"http": HTTPConnectionPool, "https": HTTPSProxyConnectionPool}
133151

0 commit comments

Comments
 (0)