From 836bc6fa07b1a265be51a9bcef25c58e8c1c2f70 Mon Sep 17 00:00:00 2001 From: Sylvester Kaczmarek <16242628+sylvesterkaczmarek@users.noreply.github.com> Date: Thu, 10 Sep 2026 03:14:57 +0100 Subject: [PATCH 1/2] fix(streaming): validate SSE retry digits --- src/openai/_streaming.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/openai/_streaming.py b/src/openai/_streaming.py index 78e2d20aa7..0a6b272d7c 100644 --- a/src/openai/_streaming.py +++ b/src/openai/_streaming.py @@ -404,10 +404,8 @@ def decode(self, line: str) -> ServerSentEvent | None: else: self._last_event_id = value elif fieldname == "retry": - try: + if value.isascii() and value.isdigit(): self._retry = int(value) - except (TypeError, ValueError): - pass else: pass # Field is ignored. From a211616bffb7f05339f3dde01d78fa846be09cb0 Mon Sep 17 00:00:00 2001 From: Sylvester Kaczmarek <16242628+sylvesterkaczmarek@users.noreply.github.com> Date: Thu, 10 Sep 2026 03:15:10 +0100 Subject: [PATCH 2/2] test(streaming): cover invalid SSE retry values --- tests/test_sse_retry_validation.py | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 tests/test_sse_retry_validation.py diff --git a/tests/test_sse_retry_validation.py b/tests/test_sse_retry_validation.py new file mode 100644 index 0000000000..0925942f6c --- /dev/null +++ b/tests/test_sse_retry_validation.py @@ -0,0 +1,25 @@ +import pytest + +from openai._streaming import SSEDecoder + + +@pytest.mark.parametrize("value", ["-1", "+1000", "١٠٠٠", "1.0", "1_000"]) +def test_invalid_retry_value_is_ignored(value: str) -> None: + decoder = SSEDecoder() + decoder.decode("retry: 2500") + decoder.decode(f"retry: {value}") + decoder.decode("data: {}") + + event = decoder.decode("") + assert event is not None + assert event.retry == 2500 + + +def test_ascii_retry_digits_are_accepted() -> None: + decoder = SSEDecoder() + decoder.decode("retry: 0010") + decoder.decode("data: {}") + + event = decoder.decode("") + assert event is not None + assert event.retry == 10