mercurial/httppeer.py
changeset 37006 8e89c2bec1f7
parent 36961 586891c561dc
child 37320 39f7d4ee8bcd
equal deleted inserted replaced
37005:66c0ff381cfc 37006:8e89c2bec1f7
   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: