##// END OF EJS Templates
httprepo: quote the path part of the URL...
Alexis S. L. Carvalho -
r5066:167c422c default
parent child Browse files
Show More
@@ -144,6 +144,43 b' def zgenerator(f):'
144 144 raise IOError(None, _('connection ended unexpectedly'))
145 145 yield zd.flush()
146 146
147 _safe = ('abcdefghijklmnopqrstuvwxyz'
148 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
149 '0123456789' '_.-/')
150 _safeset = None
151 _hex = None
152 def quotepath(path):
153 '''quote the path part of a URL
154
155 This is similar to urllib.quote, but it also tries to avoid
156 quoting things twice (inspired by wget):
157
158 >>> quotepath('abc def')
159 'abc%20def'
160 >>> quotepath('abc%20def')
161 'abc%20def'
162 >>> quotepath('abc%20 def')
163 'abc%20%20def'
164 >>> quotepath('abc def%20')
165 'abc%20def%20'
166 >>> quotepath('abc def%2')
167 'abc%20def%252'
168 >>> quotepath('abc def%')
169 'abc%20def%25'
170 '''
171 global _safeset, _hex
172 if _safeset is None:
173 _safeset = util.set(_safe)
174 _hex = util.set('abcdefABCDEF0123456789')
175 l = list(path)
176 for i in xrange(len(l)):
177 c = l[i]
178 if c == '%' and i + 2 < len(l) and (l[i+1] in _hex and l[i+2] in _hex):
179 pass
180 elif c not in _safeset:
181 l[i] = '%%%02X' % ord(c)
182 return ''.join(l)
183
147 184 class httprepository(remoterepository):
148 185 def __init__(self, ui, path):
149 186 self.path = path
@@ -153,13 +190,16 b' class httprepository(remoterepository):'
153 190 if query or frag:
154 191 raise util.Abort(_('unsupported URL component: "%s"') %
155 192 (query or frag))
156 if not urlpath: urlpath = '/'
193 if not urlpath:
194 urlpath = '/'
195 urlpath = quotepath(urlpath)
157 196 host, port, user, passwd = netlocsplit(netloc)
158 197
159 198 # urllib cannot handle URLs with embedded user or passwd
160 199 self._url = urlparse.urlunsplit((scheme, netlocunsplit(host, port),
161 200 urlpath, '', ''))
162 201 self.ui = ui
202 self.ui.debug(_('using %s\n') % self._url)
163 203
164 204 proxyurl = ui.config("http_proxy", "host") or os.getenv('http_proxy')
165 205 # XXX proxyauthinfo = None
@@ -5,3 +5,5 b' import mercurial.changelog'
5 5
6 6 doctest.testmod(mercurial.changelog)
7 7
8 import mercurial.httprepo
9 doctest.testmod(mercurial.httprepo)
General Comments 0
You need to be logged in to leave comments. Login now