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): |