]> jfr.im git - yt-dlp.git/commitdiff
[rh:requests] Handle both `bytes` and `int` for `IncompleteRead.partial` (Fix 8a8b545...
authorSimon Sawicki <redacted>
Sun, 15 Oct 2023 08:54:38 +0000 (10:54 +0200)
committerGitHub <redacted>
Sun, 15 Oct 2023 08:54:38 +0000 (10:54 +0200)
Authored by: bashonly, coletdjnz, Grub4K

test/test_networking.py
yt_dlp/networking/_requests.py
yt_dlp/networking/exceptions.py

index 2b45deac79be6ec1bacf397292b745b013a85f72..689161fb2274e5d3eae76f9ff4af94d4a7e6bcb4 100644 (file)
@@ -865,7 +865,7 @@ def request(self, *args, **kwargs):
             '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'
         ),
index 27974357aecf0d141444d98ee12801c9b0c361d4..fe3f60b0b3ac2031acb8abbe6f38bfbdfa0ffbcf 100644 (file)
@@ -142,18 +142,17 @@ def read(self, amt: int = None):
         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:
index f58dc246e618dc753dc1f58133a93db453fea7e9..12441901c970bdafe4ccf65b9216ef8262b921aa 100644 (file)
@@ -75,7 +75,7 @@ def __repr__(self):
 
 
 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'