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. 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