[rh:requests] Handle both `bytes` and `int` for `IncompleteRead.partial` (Fix 8a8b54523a) (#8348)

Authored by: bashonly, coletdjnz, Grub4K
This commit is contained in:
Simon Sawicki 2023-10-15 10:54:38 +02:00 committed by GitHub
parent 8a8b54523a
commit 4e38e2ae9d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 7 additions and 8 deletions

View File

@ -865,7 +865,7 @@ class TestRequestsRequestHandler(TestRequestHandlerBase):
'3 bytes read, 4 more expected' '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, IncompleteRead,
'3 bytes read, 5 more expected' '3 bytes read, 5 more expected'
), ),

View File

@ -142,18 +142,17 @@ class RequestsResponseAdapter(Response):
except urllib3.exceptions.SSLError as e: except urllib3.exceptions.SSLError as e:
raise SSLError(cause=e) from 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: 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() # See urllib3.response.HTTPResponse._error_catcher()
ir_err = next( ir_err = next(
(err for err in (e.__context__, e.__cause__, *variadic(e.args)) (err for err in (e.__context__, e.__cause__, *variadic(e.args))
if isinstance(err, http.client.IncompleteRead)), None) if isinstance(err, http.client.IncompleteRead)), None)
if ir_err is not 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 raise TransportError(cause=e) from e
except urllib3.exceptions.HTTPError as e: except urllib3.exceptions.HTTPError as e:

View File

@ -75,7 +75,7 @@ class HTTPError(RequestError):
class IncompleteRead(TransportError): 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.partial = partial
self.expected = expected self.expected = expected
msg = f'{partial} bytes read' msg = f'{partial} bytes read'