--- a/mercurial/url.py Tue Apr 08 13:05:29 2014 -0700
+++ b/mercurial/url.py Fri Dec 20 14:56:05 2013 +0100
@@ -7,7 +7,7 @@
# This software may be used and distributed according to the terms of the
# GNU General Public License version 2 or any later version.
-import urllib, urllib2, httplib, os, socket, cStringIO
+import urllib, urllib2, httplib, os, socket, cStringIO, base64
from i18n import _
import keepalive, util, sslutil
import httpconnection as httpconnectionmod
@@ -422,9 +422,22 @@
class httpbasicauthhandler(urllib2.HTTPBasicAuthHandler):
def __init__(self, *args, **kwargs):
+ self.auth = None
urllib2.HTTPBasicAuthHandler.__init__(self, *args, **kwargs)
self.retried_req = None
+ def http_request(self, request):
+ if self.auth:
+ request.add_unredirected_header(self.auth_header, self.auth)
+
+ return request
+
+ def https_request(self, request):
+ if self.auth:
+ request.add_unredirected_header(self.auth_header, self.auth)
+
+ return request
+
def reset_retry_count(self):
# Python 2.6.5 will call this on 401 or 407 errors and thus loop
# forever. We disable reset_retry_count completely and reset in
@@ -439,6 +452,19 @@
return urllib2.HTTPBasicAuthHandler.http_error_auth_reqed(
self, auth_header, host, req, headers)
+ def retry_http_basic_auth(self, host, req, realm):
+ user, pw = self.passwd.find_user_password(realm, req.get_full_url())
+ if pw is not None:
+ raw = "%s:%s" % (user, pw)
+ auth = 'Basic %s' % base64.b64encode(raw).strip()
+ if req.headers.get(self.auth_header, None) == auth:
+ return None
+ self.auth = auth
+ req.add_unredirected_header(self.auth_header, auth)
+ return self.parent.open(req)
+ else:
+ return None
+
handlerfuncs = []
def opener(ui, authinfo=None):