schemes: fix // breakage with Python 2.6.5 (issue2111)

Recent Pythons (e.g. 2.6.5 and 3.1) introduce a change that causes
urlparse.urlunparse(urlparse.urlparse('x://')) to return 'x:' instead of 'x://'i and
urlparse.urlunparse(urlparse.urlparse('x:///y')) to return 'x:/y' instead of 'x:///y'.
Fix url.hidepassword() and url.removeauth() to handle these cases.
This commit is contained in:
Michael Glassford 2010-04-08 11:00:46 -04:00
parent 3a8d40d5c3
commit f37b4abb21

View File

@ -11,17 +11,28 @@ import urllib, urllib2, urlparse, httplib, os, re, socket, cStringIO
from i18n import _
import keepalive, util
def _urlunparse(scheme, netloc, path, params, query, fragment, url):
'''Handle cases where urlunparse(urlparse(x://)) doesn't preserve the "//"'''
result = urlparse.urlunparse((scheme, netloc, path, params, query, fragment))
if (scheme and
result.startswith(scheme + ':') and
not result.startswith(scheme + '://') and
url.startswith(scheme + '://')
):
result = scheme + '://' + result[len(scheme + ':'):]
return result
def hidepassword(url):
'''hide user credential in a url string'''
scheme, netloc, path, params, query, fragment = urlparse.urlparse(url)
netloc = re.sub('([^:]*):([^@]*)@(.*)', r'\1:***@\3', netloc)
return urlparse.urlunparse((scheme, netloc, path, params, query, fragment))
return _urlunparse(scheme, netloc, path, params, query, fragment, url)
def removeauth(url):
'''remove all authentication information from a url string'''
scheme, netloc, path, params, query, fragment = urlparse.urlparse(url)
netloc = netloc[netloc.find('@')+1:]
return urlparse.urlunparse((scheme, netloc, path, params, query, fragment))
return _urlunparse(scheme, netloc, path, params, query, fragment, url)
def netlocsplit(netloc):
'''split [user[:passwd]@]host[:port] into 4-tuple.'''