# HG changeset patch # User Gregory Szorc # Date 2018-04-10 17:22:26 # Node ID 835ccc2a5ef1761e9669e69205f08630f7634a1b # Parent 3a2367e6c6f2106ca60f3dd04cd4c02b288fe90e httppeer: move requestbuilder defaults into makepeer() argument Upcoming commits will move the initial ?cmd=capabilities handshake request out of httppeer so the handshake can be performed before a peer instance is constructed. In order to do this, we'll need to refactor code for making HTTP requests. The type used to construct HTTP requests is configurable. If we'll be making HTTP requests outside of httppeer, we should be able to use a custom request builder. So move the definition of that type into makepeer(). Extensions can monkeypatch the function and override the argument value. Differential Revision: https://phab.mercurial-scm.org/D3232 diff --git a/mercurial/debugcommands.py b/mercurial/debugcommands.py --- a/mercurial/debugcommands.py +++ b/mercurial/debugcommands.py @@ -2915,7 +2915,8 @@ def debugwireproto(ui, repo, path=None, raise error.Abort(_('--peer %s not supported with HTTP peers') % opts['peer']) else: - peer = httppeer.httppeer(ui, path, url, opener) + peer = httppeer.httppeer(ui, path, url, opener, + requestbuilder=httppeer.urlreq.request) peer._fetchcaps() # We /could/ populate stdin/stdout with sock.makefile()... diff --git a/mercurial/httppeer.py b/mercurial/httppeer.py --- a/mercurial/httppeer.py +++ b/mercurial/httppeer.py @@ -139,15 +139,13 @@ class _multifile(object): self._index = 0 class httppeer(wireproto.wirepeer): - def __init__(self, ui, path, url, opener): + def __init__(self, ui, path, url, opener, requestbuilder): self.ui = ui self._path = path self._url = url self._caps = None self._urlopener = opener - # This is an its own attribute to facilitate extensions overriding - # the default type. - self._requestbuilder = urlreq.request + self._requestbuilder = requestbuilder def __del__(self): for h in self._urlopener.handlers: @@ -570,7 +568,12 @@ class httpv2peer(object): return results -def makepeer(ui, path): +def makepeer(ui, path, requestbuilder=urlreq.request): + """Construct an appropriate HTTP peer instance. + + ``requestbuilder`` is the type used for constructing HTTP requests. + It exists as an argument so extensions can override the default. + """ u = util.url(path) if u.query or u.fragment: raise error.Abort(_('unsupported URL component: "%s"') % @@ -582,7 +585,7 @@ def makepeer(ui, path): opener = urlmod.opener(ui, authinfo) - return httppeer(ui, path, url, opener) + return httppeer(ui, path, url, opener, requestbuilder) def instance(ui, path, create): if create: diff --git a/tests/test-check-interfaces.py b/tests/test-check-interfaces.py --- a/tests/test-check-interfaces.py +++ b/tests/test-check-interfaces.py @@ -70,7 +70,7 @@ class dummyopener(object): # Facilitates testing sshpeer without requiring an SSH server. class badpeer(httppeer.httppeer): def __init__(self): - super(badpeer, self).__init__(None, None, None, dummyopener()) + super(badpeer, self).__init__(None, None, None, dummyopener(), None) self.badattribute = True def badmethod(self): @@ -89,7 +89,7 @@ def main(): ziverify.verifyClass(repository.ipeerbaselegacycommands, httppeer.httppeer) - checkzobject(httppeer.httppeer(None, None, None, dummyopener())) + checkzobject(httppeer.httppeer(None, None, None, dummyopener(), None)) ziverify.verifyClass(repository.ipeerbase, localrepo.localpeer)