# HG changeset patch # User Gregory Szorc # Date 2018-09-26 23:07:59 # Node ID f80db6adabbe5c7c46da457f2be39b0655106ca8 # Parent 426cb2859013d10f5c9cb89fa6d428643096e54a url: move _wraphttpresponse() from httpeer This is a generally useful function. Having it on the url module will make it more accessible outside of the HTTP peers. Differential Revision: https://phab.mercurial-scm.org/D4770 diff --git a/mercurial/httppeer.py b/mercurial/httppeer.py --- a/mercurial/httppeer.py +++ b/mercurial/httppeer.py @@ -69,42 +69,6 @@ def encodevalueinheaders(value, header, return result -def _wraphttpresponse(resp): - """Wrap an HTTPResponse with common error handlers. - - This ensures that any I/O from any consumer raises the appropriate - error and messaging. - """ - origread = resp.read - - class readerproxy(resp.__class__): - def read(self, size=None): - try: - return origread(size) - except httplib.IncompleteRead as e: - # e.expected is an integer if length known or None otherwise. - if e.expected: - got = len(e.partial) - total = e.expected + got - msg = _('HTTP request error (incomplete response; ' - 'expected %d bytes got %d)') % (total, got) - else: - msg = _('HTTP request error (incomplete response)') - - raise error.PeerTransportError( - msg, - hint=_('this may be an intermittent network failure; ' - 'if the error persists, consider contacting the ' - 'network or server operator')) - except httplib.HTTPException as e: - raise error.PeerTransportError( - _('HTTP request error (%s)') % e, - hint=_('this may be an intermittent network failure; ' - 'if the error persists, consider contacting the ' - 'network or server operator')) - - resp.__class__ = readerproxy - class _multifile(object): def __init__(self, *fileobjs): for f in fileobjs: @@ -325,7 +289,7 @@ def sendrequest(ui, opener, req): % (util.timer() - start, code)) # Insert error handlers for common I/O failures. - _wraphttpresponse(res) + urlmod.wrapresponse(res) return res diff --git a/mercurial/url.py b/mercurial/url.py --- a/mercurial/url.py +++ b/mercurial/url.py @@ -595,3 +595,39 @@ def open(ui, url_, data=None): url_ = 'file://' + pycompat.bytesurl(urlreq.pathname2url(path)) authinfo = None return opener(ui, authinfo).open(pycompat.strurl(url_), data) + +def wrapresponse(resp): + """Wrap a response object with common error handlers. + + This ensures that any I/O from any consumer raises the appropriate + error and messaging. + """ + origread = resp.read + + class readerproxy(resp.__class__): + def read(self, size=None): + try: + return origread(size) + except httplib.IncompleteRead as e: + # e.expected is an integer if length known or None otherwise. + if e.expected: + got = len(e.partial) + total = e.expected + got + msg = _('HTTP request error (incomplete response; ' + 'expected %d bytes got %d)') % (total, got) + else: + msg = _('HTTP request error (incomplete response)') + + raise error.PeerTransportError( + msg, + hint=_('this may be an intermittent network failure; ' + 'if the error persists, consider contacting the ' + 'network or server operator')) + except httplib.HTTPException as e: + raise error.PeerTransportError( + _('HTTP request error (%s)') % e, + hint=_('this may be an intermittent network failure; ' + 'if the error persists, consider contacting the ' + 'network or server operator')) + + resp.__class__ = readerproxy