Mercurial > hg
diff mercurial/url.py @ 40018:f80db6adabbe
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
author | Gregory Szorc <gregory.szorc@gmail.com> |
---|---|
date | Wed, 26 Sep 2018 16:07:59 -0700 |
parents | 126998dcfb08 |
children | f2dffa1359c6 |
line wrap: on
line diff
--- a/mercurial/url.py Wed Sep 26 14:54:15 2018 -0700 +++ b/mercurial/url.py Wed Sep 26 16:07:59 2018 -0700 @@ -595,3 +595,39 @@ 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