summaryrefslogtreecommitdiffstats
path: root/pym/portage/util/_urlopen.py
diff options
context:
space:
mode:
authorZac Medico <zmedico@gentoo.org>2012-08-01 19:28:01 -0700
committerZac Medico <zmedico@gentoo.org>2012-08-01 19:28:01 -0700
commitfbeb8101b20e232b2e8c55c9554b5fc9c5c72089 (patch)
tree20c5b9c6167f99804fe2b7d3f4ab5858401d6044 /pym/portage/util/_urlopen.py
parent13abe0398fbe724218c8c9ac2597ebe15d7db7e1 (diff)
downloadportage-fbeb8101b20e232b2e8c55c9554b5fc9c5c72089.tar.gz
portage-fbeb8101b20e232b2e8c55c9554b5fc9c5c72089.tar.bz2
portage-fbeb8101b20e232b2e8c55c9554b5fc9c5c72089.zip
_urlopen: fix python2 http password breakage
This broke in commit e06cb6d66db37ac7ab77acf65038b1f770c13c96 since CompressedResponseProcessor did not include password auth support. BUG: The if_modified_since parameter appears to be ignored when using http password authentication.
Diffstat (limited to 'pym/portage/util/_urlopen.py')
-rw-r--r--pym/portage/util/_urlopen.py40
1 files changed, 11 insertions, 29 deletions
diff --git a/pym/portage/util/_urlopen.py b/pym/portage/util/_urlopen.py
index bcd8f7c89..768ccb8a4 100644
--- a/pym/portage/util/_urlopen.py
+++ b/pym/portage/util/_urlopen.py
@@ -27,14 +27,20 @@ TIMESTAMP_TOLERANCE=5
def urlopen(url, if_modified_since=None):
parse_result = urllib_parse.urlparse(url)
- try:
- if parse_result.scheme not in ("http", "https"):
- return _urlopen(url)
+ if parse_result.scheme not in ("http", "https"):
+ return _urlopen(url)
+ else:
+ netloc = urllib_parse_splituser(parse_result.netloc)[1]
+ url = urllib_parse.urlunparse((parse_result.scheme, netloc, parse_result.path, parse_result.params, parse_result.query, parse_result.fragment))
+ password_manager = urllib_request.HTTPPasswordMgrWithDefaultRealm()
request = urllib_request.Request(url)
request.add_header('User-Agent', 'Gentoo Portage')
if if_modified_since:
request.add_header('If-Modified-Since', _timestamp_to_http(if_modified_since))
- opener = urllib_request.build_opener(CompressedResponseProcessor)
+ if parse_result.username is not None:
+ password_manager.add_password(None, url, parse_result.username, parse_result.password)
+ auth_handler = CompressedResponseProcessor(password_manager)
+ opener = urllib_request.build_opener(auth_handler)
hdl = opener.open(request)
if hdl.headers.get('last-modified', ''):
try:
@@ -44,30 +50,6 @@ def urlopen(url, if_modified_since=None):
add_header = hdl.headers.addheader
add_header('timestamp', _http_to_timestamp(hdl.headers.get('last-modified')))
return hdl
- except SystemExit:
- raise
- except Exception as e:
- if hasattr(e, 'code') and e.code == 304: # HTTPError 304: not modified
- raise
- if sys.hexversion < 0x3000000:
- raise
- if parse_result.scheme not in ("http", "https") or \
- not parse_result.username:
- raise
-
- return _new_urlopen(url)
-
-def _new_urlopen(url):
- # This is experimental code for bug #413983.
- parse_result = urllib_parse.urlparse(url)
- netloc = urllib_parse_splituser(parse_result.netloc)[1]
- url = urllib_parse.urlunparse((parse_result.scheme, netloc, parse_result.path, parse_result.params, parse_result.query, parse_result.fragment))
- password_manager = urllib_request.HTTPPasswordMgrWithDefaultRealm()
- if parse_result.username is not None:
- password_manager.add_password(None, url, parse_result.username, parse_result.password)
- auth_handler = urllib_request.HTTPBasicAuthHandler(password_manager)
- opener = urllib_request.build_opener(auth_handler)
- return opener.open(url)
def _timestamp_to_http(timestamp):
dt = datetime.fromtimestamp(float(long(timestamp)+TIMESTAMP_TOLERANCE))
@@ -79,7 +61,7 @@ def _http_to_timestamp(http_datetime_string):
timestamp = mktime(tuple)
return str(long(timestamp))
-class CompressedResponseProcessor(urllib_request.BaseHandler):
+class CompressedResponseProcessor(urllib_request.HTTPBasicAuthHandler):
# Handler for compressed responses.
def http_request(self, req):