Skip to content

Commit 10f799f

Browse files
Wrap unexpected base URL port parsing errors
Co-authored-by: Shri Sukhani <shrisukhani@users.noreply.github.com>
1 parent 0014715 commit 10f799f

2 files changed

Lines changed: 65 additions & 0 deletions

File tree

hyperbrowser/config.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,11 +87,18 @@ def normalize_base_url(base_url: str) -> str:
8787
raise HyperbrowserError("base_url must not include user credentials")
8888
try:
8989
parsed_base_url.port
90+
except HyperbrowserError:
91+
raise
9092
except ValueError as exc:
9193
raise HyperbrowserError(
9294
"base_url must contain a valid port number",
9395
original_error=exc,
9496
) from exc
97+
except Exception as exc:
98+
raise HyperbrowserError(
99+
"base_url must contain a valid port number",
100+
original_error=exc,
101+
) from exc
95102

96103
decoded_base_path = ClientConfig._decode_url_component_with_limit(
97104
parsed_base_url.path, component_label="base_url path"

tests/test_config.py

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
import pytest
55

6+
import hyperbrowser.config as config_module
67
from hyperbrowser.config import ClientConfig
78
from hyperbrowser.exceptions import HyperbrowserError
89

@@ -437,6 +438,63 @@ def test_client_config_normalize_base_url_preserves_invalid_port_original_error(
437438
ClientConfig.normalize_base_url("https://example.local:bad")
438439

439440
assert exc_info.value.original_error is not None
441+
442+
443+
def test_client_config_normalize_base_url_wraps_unexpected_port_runtime_errors(
444+
monkeypatch: pytest.MonkeyPatch,
445+
):
446+
class _ParsedURL:
447+
scheme = "https"
448+
netloc = "example.local"
449+
hostname = "example.local"
450+
query = ""
451+
fragment = ""
452+
username = None
453+
password = None
454+
path = ""
455+
456+
@property
457+
def port(self) -> int:
458+
raise RuntimeError("unexpected port parser failure")
459+
460+
monkeypatch.setattr(config_module, "urlparse", lambda _value: _ParsedURL())
461+
462+
with pytest.raises(
463+
HyperbrowserError, match="base_url must contain a valid port number"
464+
) as exc_info:
465+
ClientConfig.normalize_base_url("https://example.local")
466+
467+
assert exc_info.value.original_error is not None
468+
469+
470+
def test_client_config_normalize_base_url_preserves_hyperbrowser_port_errors(
471+
monkeypatch: pytest.MonkeyPatch,
472+
):
473+
class _ParsedURL:
474+
scheme = "https"
475+
netloc = "example.local"
476+
hostname = "example.local"
477+
query = ""
478+
fragment = ""
479+
username = None
480+
password = None
481+
path = ""
482+
483+
@property
484+
def port(self) -> int:
485+
raise HyperbrowserError("custom port parser failure")
486+
487+
monkeypatch.setattr(config_module, "urlparse", lambda _value: _ParsedURL())
488+
489+
with pytest.raises(
490+
HyperbrowserError, match="custom port parser failure"
491+
) as exc_info:
492+
ClientConfig.normalize_base_url("https://example.local")
493+
494+
assert exc_info.value.original_error is None
495+
496+
497+
def test_client_config_normalize_base_url_rejects_encoded_paths_and_hosts():
440498
with pytest.raises(
441499
HyperbrowserError, match="base_url path must not contain relative path segments"
442500
):

0 commit comments

Comments
 (0)