Skip to content

Commit fd3129f

Browse files
Harden web manager payload serialization paths
Co-authored-by: Shri Sukhani <shrisukhani@users.noreply.github.com>
1 parent d954962 commit fd3129f

7 files changed

Lines changed: 849 additions & 12 deletions

File tree

hyperbrowser/client/managers/async_manager/web/__init__.py

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from .batch_fetch import BatchFetchManager
22
from .crawl import WebCrawlManager
3+
from hyperbrowser.exceptions import HyperbrowserError
34
from hyperbrowser.models import (
45
FetchParams,
56
FetchResponse,
@@ -17,7 +18,17 @@ def __init__(self, client):
1718
self.crawl = WebCrawlManager(client)
1819

1920
async def fetch(self, params: FetchParams) -> FetchResponse:
20-
payload = params.model_dump(exclude_none=True, by_alias=True)
21+
try:
22+
payload = params.model_dump(exclude_none=True, by_alias=True)
23+
except HyperbrowserError:
24+
raise
25+
except Exception as exc:
26+
raise HyperbrowserError(
27+
"Failed to serialize web fetch params",
28+
original_error=exc,
29+
) from exc
30+
if type(payload) is not dict:
31+
raise HyperbrowserError("Failed to serialize web fetch params")
2132
inject_web_output_schemas(
2233
payload, params.outputs.formats if params.outputs else None
2334
)
@@ -33,9 +44,20 @@ async def fetch(self, params: FetchParams) -> FetchResponse:
3344
)
3445

3546
async def search(self, params: WebSearchParams) -> WebSearchResponse:
47+
try:
48+
payload = params.model_dump(exclude_none=True, by_alias=True)
49+
except HyperbrowserError:
50+
raise
51+
except Exception as exc:
52+
raise HyperbrowserError(
53+
"Failed to serialize web search params",
54+
original_error=exc,
55+
) from exc
56+
if type(payload) is not dict:
57+
raise HyperbrowserError("Failed to serialize web search params")
3658
response = await self._client.transport.post(
3759
self._client._build_url("/web/search"),
38-
data=params.model_dump(exclude_none=True, by_alias=True),
60+
data=payload,
3961
)
4062
return parse_response_model(
4163
response.data,

hyperbrowser/client/managers/async_manager/web/batch_fetch.py

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from typing import Optional
22

3+
from hyperbrowser.exceptions import HyperbrowserError
34
from hyperbrowser.models import (
45
StartBatchFetchJobParams,
56
StartBatchFetchJobResponse,
@@ -27,7 +28,17 @@ def __init__(self, client):
2728
async def start(
2829
self, params: StartBatchFetchJobParams
2930
) -> StartBatchFetchJobResponse:
30-
payload = params.model_dump(exclude_none=True, by_alias=True)
31+
try:
32+
payload = params.model_dump(exclude_none=True, by_alias=True)
33+
except HyperbrowserError:
34+
raise
35+
except Exception as exc:
36+
raise HyperbrowserError(
37+
"Failed to serialize batch fetch start params",
38+
original_error=exc,
39+
) from exc
40+
if type(payload) is not dict:
41+
raise HyperbrowserError("Failed to serialize batch fetch start params")
3142
inject_web_output_schemas(
3243
payload, params.outputs.formats if params.outputs else None
3344
)
@@ -56,9 +67,20 @@ async def get(
5667
self, job_id: str, params: Optional[GetBatchFetchJobParams] = None
5768
) -> BatchFetchJobResponse:
5869
params_obj = params or GetBatchFetchJobParams()
70+
try:
71+
query_params = params_obj.model_dump(exclude_none=True, by_alias=True)
72+
except HyperbrowserError:
73+
raise
74+
except Exception as exc:
75+
raise HyperbrowserError(
76+
"Failed to serialize batch fetch get params",
77+
original_error=exc,
78+
) from exc
79+
if type(query_params) is not dict:
80+
raise HyperbrowserError("Failed to serialize batch fetch get params")
5981
response = await self._client.transport.get(
6082
self._client._build_url(f"/web/batch-fetch/{job_id}"),
61-
params=params_obj.model_dump(exclude_none=True, by_alias=True),
83+
params=query_params,
6284
)
6385
return parse_response_model(
6486
response.data,

hyperbrowser/client/managers/async_manager/web/crawl.py

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from typing import Optional
22

3+
from hyperbrowser.exceptions import HyperbrowserError
34
from hyperbrowser.models import (
45
StartWebCrawlJobParams,
56
StartWebCrawlJobResponse,
@@ -25,7 +26,17 @@ def __init__(self, client):
2526
self._client = client
2627

2728
async def start(self, params: StartWebCrawlJobParams) -> StartWebCrawlJobResponse:
28-
payload = params.model_dump(exclude_none=True, by_alias=True)
29+
try:
30+
payload = params.model_dump(exclude_none=True, by_alias=True)
31+
except HyperbrowserError:
32+
raise
33+
except Exception as exc:
34+
raise HyperbrowserError(
35+
"Failed to serialize web crawl start params",
36+
original_error=exc,
37+
) from exc
38+
if type(payload) is not dict:
39+
raise HyperbrowserError("Failed to serialize web crawl start params")
2940
inject_web_output_schemas(
3041
payload, params.outputs.formats if params.outputs else None
3142
)
@@ -54,9 +65,20 @@ async def get(
5465
self, job_id: str, params: Optional[GetWebCrawlJobParams] = None
5566
) -> WebCrawlJobResponse:
5667
params_obj = params or GetWebCrawlJobParams()
68+
try:
69+
query_params = params_obj.model_dump(exclude_none=True, by_alias=True)
70+
except HyperbrowserError:
71+
raise
72+
except Exception as exc:
73+
raise HyperbrowserError(
74+
"Failed to serialize web crawl get params",
75+
original_error=exc,
76+
) from exc
77+
if type(query_params) is not dict:
78+
raise HyperbrowserError("Failed to serialize web crawl get params")
5779
response = await self._client.transport.get(
5880
self._client._build_url(f"/web/crawl/{job_id}"),
59-
params=params_obj.model_dump(exclude_none=True, by_alias=True),
81+
params=query_params,
6082
)
6183
return parse_response_model(
6284
response.data,

hyperbrowser/client/managers/sync_manager/web/__init__.py

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from .batch_fetch import BatchFetchManager
22
from .crawl import WebCrawlManager
3+
from hyperbrowser.exceptions import HyperbrowserError
34
from hyperbrowser.models import (
45
FetchParams,
56
FetchResponse,
@@ -17,7 +18,17 @@ def __init__(self, client):
1718
self.crawl = WebCrawlManager(client)
1819

1920
def fetch(self, params: FetchParams) -> FetchResponse:
20-
payload = params.model_dump(exclude_none=True, by_alias=True)
21+
try:
22+
payload = params.model_dump(exclude_none=True, by_alias=True)
23+
except HyperbrowserError:
24+
raise
25+
except Exception as exc:
26+
raise HyperbrowserError(
27+
"Failed to serialize web fetch params",
28+
original_error=exc,
29+
) from exc
30+
if type(payload) is not dict:
31+
raise HyperbrowserError("Failed to serialize web fetch params")
2132
inject_web_output_schemas(
2233
payload, params.outputs.formats if params.outputs else None
2334
)
@@ -33,9 +44,20 @@ def fetch(self, params: FetchParams) -> FetchResponse:
3344
)
3445

3546
def search(self, params: WebSearchParams) -> WebSearchResponse:
47+
try:
48+
payload = params.model_dump(exclude_none=True, by_alias=True)
49+
except HyperbrowserError:
50+
raise
51+
except Exception as exc:
52+
raise HyperbrowserError(
53+
"Failed to serialize web search params",
54+
original_error=exc,
55+
) from exc
56+
if type(payload) is not dict:
57+
raise HyperbrowserError("Failed to serialize web search params")
3658
response = self._client.transport.post(
3759
self._client._build_url("/web/search"),
38-
data=params.model_dump(exclude_none=True, by_alias=True),
60+
data=payload,
3961
)
4062
return parse_response_model(
4163
response.data,

hyperbrowser/client/managers/sync_manager/web/batch_fetch.py

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from typing import Optional
22

3+
from hyperbrowser.exceptions import HyperbrowserError
34
from hyperbrowser.models import (
45
StartBatchFetchJobParams,
56
StartBatchFetchJobResponse,
@@ -25,7 +26,17 @@ def __init__(self, client):
2526
self._client = client
2627

2728
def start(self, params: StartBatchFetchJobParams) -> StartBatchFetchJobResponse:
28-
payload = params.model_dump(exclude_none=True, by_alias=True)
29+
try:
30+
payload = params.model_dump(exclude_none=True, by_alias=True)
31+
except HyperbrowserError:
32+
raise
33+
except Exception as exc:
34+
raise HyperbrowserError(
35+
"Failed to serialize batch fetch start params",
36+
original_error=exc,
37+
) from exc
38+
if type(payload) is not dict:
39+
raise HyperbrowserError("Failed to serialize batch fetch start params")
2940
inject_web_output_schemas(
3041
payload, params.outputs.formats if params.outputs else None
3142
)
@@ -54,9 +65,20 @@ def get(
5465
self, job_id: str, params: Optional[GetBatchFetchJobParams] = None
5566
) -> BatchFetchJobResponse:
5667
params_obj = params or GetBatchFetchJobParams()
68+
try:
69+
query_params = params_obj.model_dump(exclude_none=True, by_alias=True)
70+
except HyperbrowserError:
71+
raise
72+
except Exception as exc:
73+
raise HyperbrowserError(
74+
"Failed to serialize batch fetch get params",
75+
original_error=exc,
76+
) from exc
77+
if type(query_params) is not dict:
78+
raise HyperbrowserError("Failed to serialize batch fetch get params")
5779
response = self._client.transport.get(
5880
self._client._build_url(f"/web/batch-fetch/{job_id}"),
59-
params=params_obj.model_dump(exclude_none=True, by_alias=True),
81+
params=query_params,
6082
)
6183
return parse_response_model(
6284
response.data,

hyperbrowser/client/managers/sync_manager/web/crawl.py

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from typing import Optional
22

3+
from hyperbrowser.exceptions import HyperbrowserError
34
from hyperbrowser.models import (
45
StartWebCrawlJobParams,
56
StartWebCrawlJobResponse,
@@ -25,7 +26,17 @@ def __init__(self, client):
2526
self._client = client
2627

2728
def start(self, params: StartWebCrawlJobParams) -> StartWebCrawlJobResponse:
28-
payload = params.model_dump(exclude_none=True, by_alias=True)
29+
try:
30+
payload = params.model_dump(exclude_none=True, by_alias=True)
31+
except HyperbrowserError:
32+
raise
33+
except Exception as exc:
34+
raise HyperbrowserError(
35+
"Failed to serialize web crawl start params",
36+
original_error=exc,
37+
) from exc
38+
if type(payload) is not dict:
39+
raise HyperbrowserError("Failed to serialize web crawl start params")
2940
inject_web_output_schemas(
3041
payload, params.outputs.formats if params.outputs else None
3142
)
@@ -54,9 +65,20 @@ def get(
5465
self, job_id: str, params: Optional[GetWebCrawlJobParams] = None
5566
) -> WebCrawlJobResponse:
5667
params_obj = params or GetWebCrawlJobParams()
68+
try:
69+
query_params = params_obj.model_dump(exclude_none=True, by_alias=True)
70+
except HyperbrowserError:
71+
raise
72+
except Exception as exc:
73+
raise HyperbrowserError(
74+
"Failed to serialize web crawl get params",
75+
original_error=exc,
76+
) from exc
77+
if type(query_params) is not dict:
78+
raise HyperbrowserError("Failed to serialize web crawl get params")
5779
response = self._client.transport.get(
5880
self._client._build_url(f"/web/crawl/{job_id}"),
59-
params=params_obj.model_dump(exclude_none=True, by_alias=True),
81+
params=query_params,
6082
)
6183
return parse_response_model(
6284
response.data,

0 commit comments

Comments
 (0)