132 for f in self._fileobjs: |
132 for f in self._fileobjs: |
133 f.seek(0) |
133 f.seek(0) |
134 self._index = 0 |
134 self._index = 0 |
135 |
135 |
136 class httppeer(wireproto.wirepeer): |
136 class httppeer(wireproto.wirepeer): |
137 def __init__(self, ui, path): |
137 def __init__(self, ui, path, url, opener): |
|
138 self._ui = ui |
138 self._path = path |
139 self._path = path |
|
140 self._url = url |
139 self._caps = None |
141 self._caps = None |
140 self._urlopener = None |
142 self._urlopener = opener |
141 # This is an its own attribute to facilitate extensions overriding |
143 # This is an its own attribute to facilitate extensions overriding |
142 # the default type. |
144 # the default type. |
143 self._requestbuilder = urlreq.request |
145 self._requestbuilder = urlreq.request |
144 u = util.url(path) |
|
145 if u.query or u.fragment: |
|
146 raise error.Abort(_('unsupported URL component: "%s"') % |
|
147 (u.query or u.fragment)) |
|
148 |
|
149 # urllib cannot handle URLs with embedded user or passwd |
|
150 self._url, authinfo = u.authinfo() |
|
151 |
|
152 self._ui = ui |
|
153 ui.debug('using %s\n' % self._url) |
|
154 |
|
155 self._urlopener = urlmod.opener(ui, authinfo) |
|
156 |
146 |
157 def __del__(self): |
147 def __del__(self): |
158 urlopener = getattr(self, '_urlopener', None) |
148 for h in self._urlopener.handlers: |
159 if urlopener: |
149 h.close() |
160 for h in urlopener.handlers: |
150 getattr(h, "close_all", lambda: None)() |
161 h.close() |
|
162 getattr(h, "close_all", lambda: None)() |
|
163 |
151 |
164 def _openurl(self, req): |
152 def _openurl(self, req): |
165 if (self._ui.debugflag |
153 if (self._ui.debugflag |
166 and self._ui.configbool('devel', 'debug.peer-request')): |
154 and self._ui.configbool('devel', 'debug.peer-request')): |
167 dbg = self._ui.debug |
155 dbg = self._ui.debug |
481 return self._callstream(cmd, _compressible=True, **args) |
469 return self._callstream(cmd, _compressible=True, **args) |
482 |
470 |
483 def _abort(self, exception): |
471 def _abort(self, exception): |
484 raise exception |
472 raise exception |
485 |
473 |
|
474 def makepeer(ui, path): |
|
475 u = util.url(path) |
|
476 if u.query or u.fragment: |
|
477 raise error.Abort(_('unsupported URL component: "%s"') % |
|
478 (u.query or u.fragment)) |
|
479 |
|
480 # urllib cannot handle URLs with embedded user or passwd. |
|
481 url, authinfo = u.authinfo() |
|
482 ui.debug('using %s\n' % url) |
|
483 |
|
484 opener = urlmod.opener(ui, authinfo) |
|
485 |
|
486 return httppeer(ui, path, url, opener) |
|
487 |
486 def instance(ui, path, create): |
488 def instance(ui, path, create): |
487 if create: |
489 if create: |
488 raise error.Abort(_('cannot create new http repository')) |
490 raise error.Abort(_('cannot create new http repository')) |
489 try: |
491 try: |
490 if path.startswith('https:') and not urlmod.has_https: |
492 if path.startswith('https:') and not urlmod.has_https: |
491 raise error.Abort(_('Python support for SSL and HTTPS ' |
493 raise error.Abort(_('Python support for SSL and HTTPS ' |
492 'is not installed')) |
494 'is not installed')) |
493 |
495 |
494 inst = httppeer(ui, path) |
496 inst = makepeer(ui, path) |
495 inst._fetchcaps() |
497 inst._fetchcaps() |
496 |
498 |
497 return inst |
499 return inst |
498 except error.RepoError as httpexception: |
500 except error.RepoError as httpexception: |
499 try: |
501 try: |