Skip to content

Commit 4612259

Browse files
committed
Catch utf8 decoding errors explicitly.
Previously, utf8 decode errors bubbled up into json.JSONDecodeError error handling, which triggered a bug in py310 specifically: - The failing test was test_http_multipart_invalid_utf8 (test #17) - It sends invalid utf8 bytes (\xff\xfe) in the multipart response - aiohttp's part.text() raises a UnicodeDecodeError - The HTTP multipart transport wasn't catching UnicodeDecodeError, only json.JSONDecodeError - When pytest tried to format the uncaught underlying UnicodeDecodeError, the exceptiongroup package in py310 hit an internal bug: File "/home/runner/work/gql/gql/.tox/pypy3/lib/pypy3.10/site-packages/exceptiongroup/_formatting.py", line 329, in format_exception_only yield _format_final_exc_line(stype, self._str) File "/home/runner/work/gql/gql/.tox/pypy3/lib/pypy3.10/site-packages/exceptiongroup/_formatting.py", line 33, in _format_final_exc_line line = f"{etype}: {valuestr}\n" SystemError: unexpected internal exception (please report a bug): <CheckError object at 0x336b7e90> Catching the utf8 decoding error specifically does actually improve error handling anyway since it gives a more specific warning to the user imo.
1 parent 8611f81 commit 4612259

File tree

1 file changed

+4
-3
lines changed

1 file changed

+4
-3
lines changed

gql/transport/http_multipart_transport.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -303,10 +303,11 @@ async def _parse_multipart_part(
303303
errors=payload.get("errors"),
304304
extensions=payload.get("extensions"),
305305
)
306+
except UnicodeDecodeError as e:
307+
log.warning(f"Skipping part - failed to decode as UTF-8: {e}")
308+
return None
306309
except json.JSONDecodeError as e:
307-
log.warning(
308-
f"Failed to parse JSON: {e}, body: {body[:100] if body else ''}"
309-
)
310+
log.warning(f"Skipping part - failed to parse JSON: {e}")
310311
return None
311312

312313
async def execute(

0 commit comments

Comments
 (0)