'3 bytes read, 4 more expected'
),
(
- lambda: urllib3.exceptions.IncompleteRead(partial=3, expected=5),
+ lambda: urllib3.exceptions.ProtocolError('error', urllib3.exceptions.IncompleteRead(partial=3, expected=5)),
IncompleteRead,
'3 bytes read, 5 more expected'
),
except urllib3.exceptions.SSLError as e:
raise SSLError(cause=e) from e
- except urllib3.exceptions.IncompleteRead as e:
- # urllib3 IncompleteRead.partial is always an integer
- raise IncompleteRead(partial=e.partial, expected=e.expected) from e
-
except urllib3.exceptions.ProtocolError as e:
- # http.client.IncompleteRead may be contained within ProtocolError
+ # IncompleteRead is always contained within ProtocolError
# See urllib3.response.HTTPResponse._error_catcher()
ir_err = next(
(err for err in (e.__context__, e.__cause__, *variadic(e.args))
if isinstance(err, http.client.IncompleteRead)), None)
if ir_err is not None:
- raise IncompleteRead(partial=len(ir_err.partial), expected=ir_err.expected) from e
+ # `urllib3.exceptions.IncompleteRead` is subclass of `http.client.IncompleteRead`
+ # but uses an `int` for its `partial` property.
+ partial = ir_err.partial if isinstance(ir_err.partial, int) else len(ir_err.partial)
+ raise IncompleteRead(partial=partial, expected=ir_err.expected) from e
raise TransportError(cause=e) from e
except urllib3.exceptions.HTTPError as e:
class IncompleteRead(TransportError):
- def __init__(self, partial: int, expected: int = None, **kwargs):
+ def __init__(self, partial: int, expected: int | None = None, **kwargs):
self.partial = partial
self.expected = expected
msg = f'{partial} bytes read'