aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZac Medico <zmedico@gentoo.org>2012-05-13 22:01:51 -0700
committerZac Medico <zmedico@gentoo.org>2012-05-13 22:01:51 -0700
commit2c191d17c5c879c51aeb1c6043d9185b9a5887c0 (patch)
treea3fcbe096816732f89d079c75e58c552deeb157c /pym/portage/util
parentgetbinpkg: fix base64 usage for python3 (diff)
downloadportage-2c191d17c5c879c51aeb1c6043d9185b9a5887c0.tar.gz
portage-2c191d17c5c879c51aeb1c6043d9185b9a5887c0.tar.bz2
portage-2c191d17c5c879c51aeb1c6043d9185b9a5887c0.zip
binhost: http auth for python3 (bug #413983)
This uses the code from commit 58a8cd1bb943522bc53d02c008ee8eff798bfaaa as a fallback for python3 when the default urlopen function fails. This has been tested and is known to work with thttpd password authentication (it works unencrypted and also when encrypted with stunnel).
Diffstat (limited to 'pym/portage/util')
-rw-r--r--pym/portage/util/_urlopen.py42
1 files changed, 42 insertions, 0 deletions
diff --git a/pym/portage/util/_urlopen.py b/pym/portage/util/_urlopen.py
new file mode 100644
index 000000000..307624bc4
--- /dev/null
+++ b/pym/portage/util/_urlopen.py
@@ -0,0 +1,42 @@
+# Copyright 2012 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+
+import sys
+
+try:
+ from urllib.request import urlopen as _urlopen
+ import urllib.parse as urllib_parse
+ import urllib.request as urllib_request
+ from urllib.parse import splituser as urllib_parse_splituser
+except ImportError:
+ from urllib import urlopen as _urlopen
+ import urlparse as urllib_parse
+ import urllib2 as urllib_request
+ from urllib import splituser as urllib_parse_splituser
+
+def urlopen(url):
+ try:
+ return _urlopen(url)
+ except SystemExit:
+ raise
+ except Exception:
+ if sys.hexversion < 0x3000000:
+ raise
+ parse_result = urllib_parse.urlparse(url)
+ 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)