mercurial/httppeer.py
changeset 40018 f80db6adabbe
parent 39630 9c2c77c73f23
child 40019 f5a05bb48116
equal deleted inserted replaced
40017:426cb2859013 40018:f80db6adabbe
    66     for i in pycompat.xrange(0, len(value), valuelen):
    66     for i in pycompat.xrange(0, len(value), valuelen):
    67         n += 1
    67         n += 1
    68         result.append((fmt % str(n), pycompat.strurl(value[i:i + valuelen])))
    68         result.append((fmt % str(n), pycompat.strurl(value[i:i + valuelen])))
    69 
    69 
    70     return result
    70     return result
    71 
       
    72 def _wraphttpresponse(resp):
       
    73     """Wrap an HTTPResponse with common error handlers.
       
    74 
       
    75     This ensures that any I/O from any consumer raises the appropriate
       
    76     error and messaging.
       
    77     """
       
    78     origread = resp.read
       
    79 
       
    80     class readerproxy(resp.__class__):
       
    81         def read(self, size=None):
       
    82             try:
       
    83                 return origread(size)
       
    84             except httplib.IncompleteRead as e:
       
    85                 # e.expected is an integer if length known or None otherwise.
       
    86                 if e.expected:
       
    87                     got = len(e.partial)
       
    88                     total = e.expected + got
       
    89                     msg = _('HTTP request error (incomplete response; '
       
    90                             'expected %d bytes got %d)') % (total, got)
       
    91                 else:
       
    92                     msg = _('HTTP request error (incomplete response)')
       
    93 
       
    94                 raise error.PeerTransportError(
       
    95                     msg,
       
    96                     hint=_('this may be an intermittent network failure; '
       
    97                            'if the error persists, consider contacting the '
       
    98                            'network or server operator'))
       
    99             except httplib.HTTPException as e:
       
   100                 raise error.PeerTransportError(
       
   101                     _('HTTP request error (%s)') % e,
       
   102                     hint=_('this may be an intermittent network failure; '
       
   103                            'if the error persists, consider contacting the '
       
   104                            'network or server operator'))
       
   105 
       
   106     resp.__class__ = readerproxy
       
   107 
    71 
   108 class _multifile(object):
    72 class _multifile(object):
   109     def __init__(self, *fileobjs):
    73     def __init__(self, *fileobjs):
   110         for f in fileobjs:
    74         for f in fileobjs:
   111             if not util.safehasattr(f, 'length'):
    75             if not util.safehasattr(f, 'length'):
   323             code = res.code if res else -1
   287             code = res.code if res else -1
   324             dbg(line % '  finished in %.4f seconds (%d)'
   288             dbg(line % '  finished in %.4f seconds (%d)'
   325                 % (util.timer() - start, code))
   289                 % (util.timer() - start, code))
   326 
   290 
   327     # Insert error handlers for common I/O failures.
   291     # Insert error handlers for common I/O failures.
   328     _wraphttpresponse(res)
   292     urlmod.wrapresponse(res)
   329 
   293 
   330     return res
   294     return res
   331 
   295 
   332 class RedirectedRepoError(error.RepoError):
   296 class RedirectedRepoError(error.RepoError):
   333     def __init__(self, msg, respurl):
   297     def __init__(self, msg, respurl):