From fbeb8101b20e232b2e8c55c9554b5fc9c5c72089 Mon Sep 17 00:00:00 2001 From: Zac Medico Date: Wed, 1 Aug 2012 19:28:01 -0700 Subject: _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. --- pym/portage/util/_urlopen.py | 40 +++++++++++----------------------------- 1 file changed, 11 insertions(+), 29 deletions(-) (limited to 'pym/portage/util/_urlopen.py') 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): -- cgit v1.2.3-1-g7c22