mercurial/httppeer.py
changeset 33805 f913e90f15a0
parent 33705 73fd395ee29e
child 33806 dedab036215d
equal deleted inserted replaced
33804:1f8460b55986 33805:f913e90f15a0
    19 from . import (
    19 from . import (
    20     bundle2,
    20     bundle2,
    21     error,
    21     error,
    22     httpconnection,
    22     httpconnection,
    23     pycompat,
    23     pycompat,
       
    24     repository,
    24     statichttprepo,
    25     statichttprepo,
    25     url,
    26     url,
    26     util,
    27     util,
    27     wireproto,
    28     wireproto,
    28 )
    29 )
    84                            'if the error persists, consider contacting the '
    85                            'if the error persists, consider contacting the '
    85                            'network or server operator'))
    86                            'network or server operator'))
    86 
    87 
    87     resp.__class__ = readerproxy
    88     resp.__class__ = readerproxy
    88 
    89 
    89 class httppeer(wireproto.wirepeer):
    90 class httppeer(wireproto.wirepeer, repository.legacypeer):
    90     def __init__(self, ui, path):
    91     def __init__(self, ui, path):
    91         self._path = path
    92         self._path = path
    92         self._caps = None
    93         self._caps = None
    93         self._urlopener = None
    94         self._urlopener = None
    94         self._requestbuilder = None
    95         self._requestbuilder = None
    98                              (u.query or u.fragment))
    99                              (u.query or u.fragment))
    99 
   100 
   100         # urllib cannot handle URLs with embedded user or passwd
   101         # urllib cannot handle URLs with embedded user or passwd
   101         self._url, authinfo = u.authinfo()
   102         self._url, authinfo = u.authinfo()
   102 
   103 
   103         self.ui = ui
   104         self._ui = ui
   104         self.ui.debug('using %s\n' % self._url)
   105         ui.debug('using %s\n' % self._url)
   105 
   106 
   106         self._urlopener = url.opener(ui, authinfo)
   107         self._urlopener = url.opener(ui, authinfo)
   107         self._requestbuilder = urlreq.request
   108         self._requestbuilder = urlreq.request
       
   109 
       
   110         # TODO remove once peerrepository isn't in inheritance.
       
   111         self._capabilities = self.capabilities
   108 
   112 
   109     def __del__(self):
   113     def __del__(self):
   110         urlopener = getattr(self, '_urlopener', None)
   114         urlopener = getattr(self, '_urlopener', None)
   111         if urlopener:
   115         if urlopener:
   112             for h in urlopener.handlers:
   116             for h in urlopener.handlers:
   113                 h.close()
   117                 h.close()
   114                 getattr(h, "close_all", lambda : None)()
   118                 getattr(h, "close_all", lambda : None)()
   115 
   119 
       
   120     # Begin of _basepeer interface.
       
   121 
       
   122     @util.propertycache
       
   123     def ui(self):
       
   124         return self._ui
       
   125 
   116     def url(self):
   126     def url(self):
   117         return self._path
   127         return self._path
   118 
   128 
   119     # look up capabilities only when needed
   129     def local(self):
   120 
   130         return None
   121     def _fetchcaps(self):
   131 
   122         self._caps = set(self._call('capabilities').split())
   132     def peer(self):
   123 
   133         return self
   124     def _capabilities(self):
   134 
       
   135     def canpush(self):
       
   136         return True
       
   137 
       
   138     def close(self):
       
   139         pass
       
   140 
       
   141     # End of _basepeer interface.
       
   142 
       
   143     # Begin of _basewirepeer interface.
       
   144 
       
   145     def capabilities(self):
   125         if self._caps is None:
   146         if self._caps is None:
   126             try:
   147             try:
   127                 self._fetchcaps()
   148                 self._fetchcaps()
   128             except error.RepoError:
   149             except error.RepoError:
   129                 self._caps = set()
   150                 self._caps = set()
   130             self.ui.debug('capabilities: %s\n' %
   151             self.ui.debug('capabilities: %s\n' %
   131                           (' '.join(self._caps or ['none'])))
   152                           (' '.join(self._caps or ['none'])))
   132         return self._caps
   153         return self._caps
       
   154 
       
   155     # End of _basewirepeer interface.
       
   156 
       
   157     # look up capabilities only when needed
       
   158 
       
   159     def _fetchcaps(self):
       
   160         self._caps = set(self._call('capabilities').split())
   133 
   161 
   134     def _callstream(self, cmd, _compressible=False, **args):
   162     def _callstream(self, cmd, _compressible=False, **args):
   135         if cmd == 'pushkey':
   163         if cmd == 'pushkey':
   136             args['data'] = ''
   164             args['data'] = ''
   137         data = args.pop('data', None)
   165         data = args.pop('data', None)