diff -r 861f28212398 -r e7525a555a64 mercurial/url.py --- a/mercurial/url.py Fri May 06 09:57:55 2011 -0500 +++ b/mercurial/url.py Fri May 06 10:22:08 2011 -0500 @@ -8,41 +8,9 @@ # GNU General Public License version 2 or any later version. import urllib, urllib2, httplib, os, socket, cStringIO -import __builtin__ from i18n import _ import keepalive, util, sslutil - -def readauthforuri(ui, uri): - # Read configuration - config = dict() - for key, val in ui.configitems('auth'): - if '.' not in key: - ui.warn(_("ignoring invalid [auth] key '%s'\n") % key) - continue - group, setting = key.rsplit('.', 1) - gdict = config.setdefault(group, dict()) - if setting in ('username', 'cert', 'key'): - val = util.expandpath(val) - gdict[setting] = val - - # Find the best match - scheme, hostpath = uri.split('://', 1) - bestlen = 0 - bestauth = None - for group, auth in config.iteritems(): - prefix = auth.get('prefix') - if not prefix: - continue - p = prefix.split('://', 1) - if len(p) > 1: - schemes, prefix = [p[0]], p[1] - else: - schemes = (auth.get('schemes') or 'https').split() - if (prefix == '*' or hostpath.startswith(prefix)) and \ - len(prefix) > bestlen and scheme in schemes: - bestlen = len(prefix) - bestauth = group, auth - return bestauth +import httpconnection as httpconnectionmod class passwordmgr(urllib2.HTTPPasswordMgrWithDefaultRealm): def __init__(self, ui): @@ -58,7 +26,7 @@ return (user, passwd) if not user: - res = readauthforuri(self.ui, authuri) + res = httpconnectionmod.readauthforuri(self.ui, authuri) if res: group, auth = res user, passwd = auth.get('username'), auth.get('password') @@ -149,48 +117,10 @@ return urllib2.ProxyHandler.proxy_open(self, req, proxy, type_) -class httpsendfile(object): - """This is a wrapper around the objects returned by python's "open". - - Its purpose is to send file-like objects via HTTP and, to do so, it - defines a __len__ attribute to feed the Content-Length header. - """ - - def __init__(self, ui, *args, **kwargs): - # We can't just "self._data = open(*args, **kwargs)" here because there - # is an "open" function defined in this module that shadows the global - # one - self.ui = ui - self._data = __builtin__.open(*args, **kwargs) - self.seek = self._data.seek - self.close = self._data.close - self.write = self._data.write - self._len = os.fstat(self._data.fileno()).st_size - self._pos = 0 - self._total = len(self) / 1024 * 2 - - def read(self, *args, **kwargs): - try: - ret = self._data.read(*args, **kwargs) - except EOFError: - self.ui.progress(_('sending'), None) - self._pos += len(ret) - # We pass double the max for total because we currently have - # to send the bundle twice in the case of a server that - # requires authentication. Since we can't know until we try - # once whether authentication will be required, just lie to - # the user and maybe the push succeeds suddenly at 50%. - self.ui.progress(_('sending'), self._pos / 1024, - unit=_('kb'), total=self._total) - return ret - - def __len__(self): - return self._len - def _gen_sendfile(orgsend): def _sendfile(self, data): # send a file - if isinstance(data, httpsendfile): + if isinstance(data, httpconnectionmod.httpsendfile): # if auth required, some data sent twice, so rewind here data.seek(0) for chunk in util.filechunkiter(data): @@ -412,7 +342,7 @@ return keepalive.KeepAliveHandler._start_transaction(self, h, req) def https_open(self, req): - res = readauthforuri(self.ui, req.get_full_url()) + res = httpconnectionmod.readauthforuri(self.ui, req.get_full_url()) if res: group, auth = res self.auth = auth @@ -495,9 +425,12 @@ construct an opener suitable for urllib2 authinfo will be added to the password manager ''' - handlers = [httphandler()] - if has_https: - handlers.append(httpshandler(ui)) + if ui.configbool('ui', 'usehttp2', False): + handlers = [httpconnectionmod.http2handler(ui, passwordmgr(ui))] + else: + handlers = [httphandler()] + if has_https: + handlers.append(httpshandler(ui)) handlers.append(proxyhandler(ui))