This is similar to what we did to sshpeer. Quirks and all.
Details
Details
Diff Detail
Diff Detail
- Repository
 - rHG Mercurial
 - Lint
 Automatic diff as part of commit; lint not applicable. - Unit
 Automatic diff as part of commit; unit tests not applicable. 
| hg-reviewers | 
This is similar to what we did to sshpeer. Quirks and all.
| Automatic diff as part of commit; lint not applicable. | 
| Automatic diff as part of commit; unit tests not applicable. | 
| from .i18n import _ | from .i18n import _ | ||||
| from .node import nullid | from .node import nullid | ||||
| from . import ( | from . import ( | ||||
| bundle2, | bundle2, | ||||
| error, | error, | ||||
| httpconnection, | httpconnection, | ||||
| pycompat, | pycompat, | ||||
| repository, | |||||
| statichttprepo, | statichttprepo, | ||||
| url, | url, | ||||
| util, | util, | ||||
| wireproto, | wireproto, | ||||
| ) | ) | ||||
| httplib = util.httplib | httplib = util.httplib | ||||
| urlerr = util.urlerr | urlerr = util.urlerr | ||||
| raise error.PeerTransportError( | raise error.PeerTransportError( | ||||
| _('HTTP request error (%s)') % e, | _('HTTP request error (%s)') % e, | ||||
| hint=_('this may be an intermittent network failure; ' | hint=_('this may be an intermittent network failure; ' | ||||
| 'if the error persists, consider contacting the ' | 'if the error persists, consider contacting the ' | ||||
| 'network or server operator')) | 'network or server operator')) | ||||
| resp.__class__ = readerproxy | resp.__class__ = readerproxy | ||||
| class httppeer(wireproto.wirepeer): | class httppeer(wireproto.wirepeer, repository.legacypeer): | ||||
| def __init__(self, ui, path): | def __init__(self, ui, path): | ||||
| self._path = path | self._path = path | ||||
| self._caps = None | self._caps = None | ||||
| self._urlopener = None | self._urlopener = None | ||||
| self._requestbuilder = None | self._requestbuilder = None | ||||
| u = util.url(path) | u = util.url(path) | ||||
| if u.query or u.fragment: | if u.query or u.fragment: | ||||
| raise error.Abort(_('unsupported URL component: "%s"') % | raise error.Abort(_('unsupported URL component: "%s"') % | ||||
| (u.query or u.fragment)) | (u.query or u.fragment)) | ||||
| # urllib cannot handle URLs with embedded user or passwd | # urllib cannot handle URLs with embedded user or passwd | ||||
| self._url, authinfo = u.authinfo() | self._url, authinfo = u.authinfo() | ||||
| self.ui = ui | self._ui = ui | ||||
| self.ui.debug('using %s\n' % self._url) | ui.debug('using %s\n' % self._url) | ||||
| self._urlopener = url.opener(ui, authinfo) | self._urlopener = url.opener(ui, authinfo) | ||||
| self._requestbuilder = urlreq.request | self._requestbuilder = urlreq.request | ||||
| # TODO remove once peerrepository isn't in inheritance. | |||||
| self._capabilities = self.capabilities | |||||
| def __del__(self): | def __del__(self): | ||||
| urlopener = getattr(self, '_urlopener', None) | urlopener = getattr(self, '_urlopener', None) | ||||
| if urlopener: | if urlopener: | ||||
| for h in urlopener.handlers: | for h in urlopener.handlers: | ||||
| h.close() | h.close() | ||||
| getattr(h, "close_all", lambda : None)() | getattr(h, "close_all", lambda : None)() | ||||
| # Begin of _basepeer interface. | |||||
| @util.propertycache | |||||
| def ui(self): | |||||
| return self._ui | |||||
| def url(self): | def url(self): | ||||
| return self._path | return self._path | ||||
| # look up capabilities only when needed | def local(self): | ||||
| return None | |||||
| def _fetchcaps(self): | def peer(self): | ||||
| self._caps = set(self._call('capabilities').split()) | return self | ||||
| def canpush(self): | |||||
| return True | |||||
| def close(self): | |||||
| pass | |||||
| def _capabilities(self): | # End of _basepeer interface. | ||||
| # Begin of _basewirepeer interface. | |||||
| def capabilities(self): | |||||
| if self._caps is None: | if self._caps is None: | ||||
| try: | try: | ||||
| self._fetchcaps() | self._fetchcaps() | ||||
| except error.RepoError: | except error.RepoError: | ||||
| self._caps = set() | self._caps = set() | ||||
| self.ui.debug('capabilities: %s\n' % | self.ui.debug('capabilities: %s\n' % | ||||
| (' '.join(self._caps or ['none']))) | (' '.join(self._caps or ['none']))) | ||||
| return self._caps | return self._caps | ||||
| # End of _basewirepeer interface. | |||||
| # look up capabilities only when needed | |||||
| def _fetchcaps(self): | |||||
| self._caps = set(self._call('capabilities').split()) | |||||
| def _callstream(self, cmd, _compressible=False, **args): | def _callstream(self, cmd, _compressible=False, **args): | ||||
| if cmd == 'pushkey': | if cmd == 'pushkey': | ||||
| args['data'] = '' | args['data'] = '' | ||||
| data = args.pop('data', None) | data = args.pop('data', None) | ||||
| headers = args.pop('headers', {}) | headers = args.pop('headers', {}) | ||||
| self.ui.debug("sending %s command\n" % cmd) | self.ui.debug("sending %s command\n" % cmd) | ||||
| q = [('cmd', cmd)] | q = [('cmd', cmd)] | ||||