Skip to content

Commit 42c3230

Browse files
Handle overflowing Real timing values gracefully
Co-authored-by: Shri Sukhani <shrisukhani@users.noreply.github.com>
1 parent 83b0cdf commit 42c3230

4 files changed

Lines changed: 31 additions & 2 deletions

File tree

hyperbrowser/client/polling.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,11 @@
1616
def _validate_non_negative_real(value: float, *, field_name: str) -> None:
1717
if isinstance(value, bool) or not isinstance(value, Real):
1818
raise HyperbrowserError(f"{field_name} must be a number")
19-
if not math.isfinite(float(value)):
19+
try:
20+
is_finite = math.isfinite(value)
21+
except (TypeError, ValueError, OverflowError):
22+
is_finite = False
23+
if not is_finite:
2024
raise HyperbrowserError(f"{field_name} must be finite")
2125
if value < 0:
2226
raise HyperbrowserError(f"{field_name} must be non-negative")

hyperbrowser/client/timeout_utils.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,11 @@ def validate_timeout_seconds(timeout: Optional[float]) -> None:
1010
return
1111
if isinstance(timeout, bool) or not isinstance(timeout, Real):
1212
raise HyperbrowserError("timeout must be a number")
13-
if not math.isfinite(float(timeout)):
13+
try:
14+
is_finite = math.isfinite(timeout)
15+
except (TypeError, ValueError, OverflowError):
16+
is_finite = False
17+
if not is_finite:
1418
raise HyperbrowserError("timeout must be finite")
1519
if timeout < 0:
1620
raise HyperbrowserError("timeout must be non-negative")

tests/test_client_timeout.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import asyncio
22
import math
3+
from fractions import Fraction
34

45
import pytest
56

@@ -60,3 +61,13 @@ def test_sync_client_rejects_non_finite_timeout(invalid_timeout: float):
6061
def test_async_client_rejects_non_finite_timeout(invalid_timeout: float):
6162
with pytest.raises(HyperbrowserError, match="timeout must be finite"):
6263
AsyncHyperbrowser(api_key="test-key", timeout=invalid_timeout)
64+
65+
66+
def test_sync_client_rejects_overflowing_real_timeout():
67+
with pytest.raises(HyperbrowserError, match="timeout must be finite"):
68+
Hyperbrowser(api_key="test-key", timeout=Fraction(10**1000, 1))
69+
70+
71+
def test_async_client_rejects_overflowing_real_timeout():
72+
with pytest.raises(HyperbrowserError, match="timeout must be finite"):
73+
AsyncHyperbrowser(api_key="test-key", timeout=Fraction(10**1000, 1))

tests/test_polling.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import asyncio
22
import math
3+
from fractions import Fraction
34

45
import pytest
56

@@ -785,6 +786,15 @@ def test_polling_helpers_validate_retry_and_interval_configuration():
785786
retry_delay_seconds=0.0,
786787
)
787788

789+
with pytest.raises(HyperbrowserError, match="poll_interval_seconds must be finite"):
790+
poll_until_terminal_status(
791+
operation_name="invalid-poll-interval-overflowing-real",
792+
get_status=lambda: "completed",
793+
is_terminal_status=lambda value: value == "completed",
794+
poll_interval_seconds=Fraction(10**1000, 1), # type: ignore[arg-type]
795+
max_wait_seconds=1.0,
796+
)
797+
788798
async def validate_async_operation_name() -> None:
789799
with pytest.raises(HyperbrowserError, match="operation_name must not be empty"):
790800
await poll_until_terminal_status_async(

0 commit comments

Comments
 (0)