|
@@ -2182,8 +2182,28 @@ def sanitize_url(url):
|
|
|
return url
|
|
|
|
|
|
|
|
|
+def extract_basic_auth(url):
|
|
|
+ parts = compat_urllib_parse.urlsplit(url)
|
|
|
+ if parts.username is None:
|
|
|
+ return url, None
|
|
|
+ url = compat_urllib_parse.urlunsplit(parts._replace(netloc=(
|
|
|
+ parts.hostname if parts.port is None
|
|
|
+ else '%s:%d' % (parts.hostname, parts.port))))
|
|
|
+ auth_payload = base64.b64encode(
|
|
|
+ ('%s:%s' % (parts.username, parts.password or '')).encode('utf-8'))
|
|
|
+ return url, 'Basic {0}'.format(auth_payload.decode('ascii'))
|
|
|
+
|
|
|
+
|
|
|
def sanitized_Request(url, *args, **kwargs):
|
|
|
- return compat_urllib_request.Request(escape_url(sanitize_url(url)), *args, **kwargs)
|
|
|
+ url, auth_header = extract_basic_auth(escape_url(sanitize_url(url)))
|
|
|
+ if auth_header is not None:
|
|
|
+ headers = args[1] if len(args) > 1 else kwargs.get('headers')
|
|
|
+ headers = headers or {}
|
|
|
+ headers['Authorization'] = auth_header
|
|
|
+ if len(args) <= 1 and kwargs.get('headers') is None:
|
|
|
+ kwargs['headers'] = headers
|
|
|
+ kwargs = compat_kwargs(kwargs)
|
|
|
+ return compat_urllib_request.Request(url, *args, **kwargs)
|
|
|
|
|
|
|
|
|
def expand_path(s):
|