mercurial/httppeer.py
changeset 37547 835ccc2a5ef1
parent 37546 3a2367e6c6f2
child 37548 8e7a4435ab6d
equal deleted inserted replaced
37546:3a2367e6c6f2 37547:835ccc2a5ef1
   137         for f in self._fileobjs:
   137         for f in self._fileobjs:
   138             f.seek(0)
   138             f.seek(0)
   139         self._index = 0
   139         self._index = 0
   140 
   140 
   141 class httppeer(wireproto.wirepeer):
   141 class httppeer(wireproto.wirepeer):
   142     def __init__(self, ui, path, url, opener):
   142     def __init__(self, ui, path, url, opener, requestbuilder):
   143         self.ui = ui
   143         self.ui = ui
   144         self._path = path
   144         self._path = path
   145         self._url = url
   145         self._url = url
   146         self._caps = None
   146         self._caps = None
   147         self._urlopener = opener
   147         self._urlopener = opener
   148         # This is an its own attribute to facilitate extensions overriding
   148         self._requestbuilder = requestbuilder
   149         # the default type.
       
   150         self._requestbuilder = urlreq.request
       
   151 
   149 
   152     def __del__(self):
   150     def __del__(self):
   153         for h in self._urlopener.handlers:
   151         for h in self._urlopener.handlers:
   154             h.close()
   152             h.close()
   155             getattr(h, "close_all", lambda: None)()
   153             getattr(h, "close_all", lambda: None)()
   568             else:
   566             else:
   569                 error.ProgrammingError('unhandled action: %s' % action)
   567                 error.ProgrammingError('unhandled action: %s' % action)
   570 
   568 
   571         return results
   569         return results
   572 
   570 
   573 def makepeer(ui, path):
   571 def makepeer(ui, path, requestbuilder=urlreq.request):
       
   572     """Construct an appropriate HTTP peer instance.
       
   573 
       
   574     ``requestbuilder`` is the type used for constructing HTTP requests.
       
   575     It exists as an argument so extensions can override the default.
       
   576     """
   574     u = util.url(path)
   577     u = util.url(path)
   575     if u.query or u.fragment:
   578     if u.query or u.fragment:
   576         raise error.Abort(_('unsupported URL component: "%s"') %
   579         raise error.Abort(_('unsupported URL component: "%s"') %
   577                           (u.query or u.fragment))
   580                           (u.query or u.fragment))
   578 
   581 
   580     url, authinfo = u.authinfo()
   583     url, authinfo = u.authinfo()
   581     ui.debug('using %s\n' % url)
   584     ui.debug('using %s\n' % url)
   582 
   585 
   583     opener = urlmod.opener(ui, authinfo)
   586     opener = urlmod.opener(ui, authinfo)
   584 
   587 
   585     return httppeer(ui, path, url, opener)
   588     return httppeer(ui, path, url, opener, requestbuilder)
   586 
   589 
   587 def instance(ui, path, create):
   590 def instance(ui, path, create):
   588     if create:
   591     if create:
   589         raise error.Abort(_('cannot create new http repository'))
   592         raise error.Abort(_('cannot create new http repository'))
   590     try:
   593     try: