httppeer: extract code for performing an HTTP request
This is generic and doesn't need to live as a method of httppeer.
Differential Revision: https://phab.mercurial-scm.org/D3233
--- a/mercurial/httppeer.py Tue Apr 10 10:22:26 2018 -0700
+++ b/mercurial/httppeer.py Tue Apr 10 10:27:49 2018 -0700
@@ -138,6 +138,46 @@
f.seek(0)
self._index = 0
+def sendrequest(ui, opener, req):
+ """Send a prepared HTTP request.
+
+ Returns the response object.
+ """
+ if (ui.debugflag
+ and ui.configbool('devel', 'debug.peer-request')):
+ dbg = ui.debug
+ line = 'devel-peer-request: %s\n'
+ dbg(line % '%s %s' % (req.get_method(), req.get_full_url()))
+ hgargssize = None
+
+ for header, value in sorted(req.header_items()):
+ if header.startswith('X-hgarg-'):
+ if hgargssize is None:
+ hgargssize = 0
+ hgargssize += len(value)
+ else:
+ dbg(line % ' %s %s' % (header, value))
+
+ if hgargssize is not None:
+ dbg(line % ' %d bytes of commands arguments in headers'
+ % hgargssize)
+
+ if req.has_data():
+ data = req.get_data()
+ length = getattr(data, 'length', None)
+ if length is None:
+ length = len(data)
+ dbg(line % ' %d bytes of data' % length)
+
+ start = util.timer()
+
+ res = opener.open(req)
+ if ui.configbool('devel', 'debug.peer-request'):
+ dbg(line % ' finished in %.4f seconds (%s)'
+ % (util.timer() - start, res.code))
+
+ return res
+
class httppeer(wireproto.wirepeer):
def __init__(self, ui, path, url, opener, requestbuilder):
self.ui = ui
@@ -152,41 +192,6 @@
h.close()
getattr(h, "close_all", lambda: None)()
- def _openurl(self, req):
- if (self.ui.debugflag
- and self.ui.configbool('devel', 'debug.peer-request')):
- dbg = self.ui.debug
- line = 'devel-peer-request: %s\n'
- dbg(line % '%s %s' % (req.get_method(), req.get_full_url()))
- hgargssize = None
-
- for header, value in sorted(req.header_items()):
- if header.startswith('X-hgarg-'):
- if hgargssize is None:
- hgargssize = 0
- hgargssize += len(value)
- else:
- dbg(line % ' %s %s' % (header, value))
-
- if hgargssize is not None:
- dbg(line % ' %d bytes of commands arguments in headers'
- % hgargssize)
-
- if req.has_data():
- data = req.get_data()
- length = getattr(data, 'length', None)
- if length is None:
- length = len(data)
- dbg(line % ' %d bytes of data' % length)
-
- start = util.timer()
-
- ret = self._urlopener.open(req)
- if self.ui.configbool('devel', 'debug.peer-request'):
- dbg(line % ' finished in %.4f seconds (%s)'
- % (util.timer() - start, ret.code))
- return ret
-
# Begin of ipeerconnection interface.
def url(self):
@@ -322,7 +327,7 @@
self.ui.debug("sending %d bytes\n" % size)
req.add_unredirected_header(r'Content-Length', r'%d' % size)
try:
- resp = self._openurl(req)
+ resp = sendrequest(self.ui, self._urlopener, req)
except urlerr.httperror as inst:
if inst.code == 401:
raise error.Abort(_('authorization failed'))