Skip to content

Commit d954962

Browse files
Harden job manager start payload serialization
Co-authored-by: Shri Sukhani <shrisukhani@users.noreply.github.com>
1 parent 0ab3771 commit d954962

7 files changed

Lines changed: 520 additions & 8 deletions

File tree

hyperbrowser/client/managers/async_manager/crawl.py

Lines changed: 13 additions & 1 deletion
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.consts import POLLING_ATTEMPTS
45
from ...polling import (
56
build_fetch_operation_name,
@@ -24,9 +25,20 @@ def __init__(self, client):
2425
self._client = client
2526

2627
async def start(self, params: StartCrawlJobParams) -> StartCrawlJobResponse:
28+
try:
29+
payload = params.model_dump(exclude_none=True, by_alias=True)
30+
except HyperbrowserError:
31+
raise
32+
except Exception as exc:
33+
raise HyperbrowserError(
34+
"Failed to serialize crawl start params",
35+
original_error=exc,
36+
) from exc
37+
if type(payload) is not dict:
38+
raise HyperbrowserError("Failed to serialize crawl start params")
2739
response = await self._client.transport.post(
2840
self._client._build_url("/crawl"),
29-
data=params.model_dump(exclude_none=True, by_alias=True),
41+
data=payload,
3042
)
3143
return parse_response_model(
3244
response.data,

hyperbrowser/client/managers/async_manager/extract.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,17 @@ async def start(self, params: StartExtractJobParams) -> StartExtractJobResponse:
2525
if not params.schema_ and not params.prompt:
2626
raise HyperbrowserError("Either schema or prompt must be provided")
2727

28-
payload = params.model_dump(exclude_none=True, by_alias=True)
28+
try:
29+
payload = params.model_dump(exclude_none=True, by_alias=True)
30+
except HyperbrowserError:
31+
raise
32+
except Exception as exc:
33+
raise HyperbrowserError(
34+
"Failed to serialize extract start params",
35+
original_error=exc,
36+
) from exc
37+
if type(payload) is not dict:
38+
raise HyperbrowserError("Failed to serialize extract start params")
2939
if params.schema_:
3040
payload["schema"] = resolve_schema_input(params.schema_)
3141

hyperbrowser/client/managers/async_manager/scrape.py

Lines changed: 25 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.consts import POLLING_ATTEMPTS
45
from ...polling import (
56
build_fetch_operation_name,
@@ -31,9 +32,20 @@ def __init__(self, client):
3132
async def start(
3233
self, params: StartBatchScrapeJobParams
3334
) -> StartBatchScrapeJobResponse:
35+
try:
36+
payload = params.model_dump(exclude_none=True, by_alias=True)
37+
except HyperbrowserError:
38+
raise
39+
except Exception as exc:
40+
raise HyperbrowserError(
41+
"Failed to serialize batch scrape start params",
42+
original_error=exc,
43+
) from exc
44+
if type(payload) is not dict:
45+
raise HyperbrowserError("Failed to serialize batch scrape start params")
3446
response = await self._client.transport.post(
3547
self._client._build_url("/scrape/batch"),
36-
data=params.model_dump(exclude_none=True, by_alias=True),
48+
data=payload,
3749
)
3850
return parse_response_model(
3951
response.data,
@@ -143,9 +155,20 @@ def __init__(self, client):
143155
self.batch = BatchScrapeManager(client)
144156

145157
async def start(self, params: StartScrapeJobParams) -> StartScrapeJobResponse:
158+
try:
159+
payload = params.model_dump(exclude_none=True, by_alias=True)
160+
except HyperbrowserError:
161+
raise
162+
except Exception as exc:
163+
raise HyperbrowserError(
164+
"Failed to serialize scrape start params",
165+
original_error=exc,
166+
) from exc
167+
if type(payload) is not dict:
168+
raise HyperbrowserError("Failed to serialize scrape start params")
146169
response = await self._client.transport.post(
147170
self._client._build_url("/scrape"),
148-
data=params.model_dump(exclude_none=True, by_alias=True),
171+
data=payload,
149172
)
150173
return parse_response_model(
151174
response.data,

hyperbrowser/client/managers/sync_manager/crawl.py

Lines changed: 13 additions & 1 deletion
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.consts import POLLING_ATTEMPTS
45
from ...polling import (
56
build_fetch_operation_name,
@@ -24,9 +25,20 @@ def __init__(self, client):
2425
self._client = client
2526

2627
def start(self, params: StartCrawlJobParams) -> StartCrawlJobResponse:
28+
try:
29+
payload = params.model_dump(exclude_none=True, by_alias=True)
30+
except HyperbrowserError:
31+
raise
32+
except Exception as exc:
33+
raise HyperbrowserError(
34+
"Failed to serialize crawl start params",
35+
original_error=exc,
36+
) from exc
37+
if type(payload) is not dict:
38+
raise HyperbrowserError("Failed to serialize crawl start params")
2739
response = self._client.transport.post(
2840
self._client._build_url("/crawl"),
29-
data=params.model_dump(exclude_none=True, by_alias=True),
41+
data=payload,
3042
)
3143
return parse_response_model(
3244
response.data,

hyperbrowser/client/managers/sync_manager/extract.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,17 @@ def start(self, params: StartExtractJobParams) -> StartExtractJobResponse:
2121
if not params.schema_ and not params.prompt:
2222
raise HyperbrowserError("Either schema or prompt must be provided")
2323

24-
payload = params.model_dump(exclude_none=True, by_alias=True)
24+
try:
25+
payload = params.model_dump(exclude_none=True, by_alias=True)
26+
except HyperbrowserError:
27+
raise
28+
except Exception as exc:
29+
raise HyperbrowserError(
30+
"Failed to serialize extract start params",
31+
original_error=exc,
32+
) from exc
33+
if type(payload) is not dict:
34+
raise HyperbrowserError("Failed to serialize extract start params")
2535
if params.schema_:
2636
payload["schema"] = resolve_schema_input(params.schema_)
2737

hyperbrowser/client/managers/sync_manager/scrape.py

Lines changed: 25 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.consts import POLLING_ATTEMPTS
45
from ...polling import (
56
build_fetch_operation_name,
@@ -29,9 +30,20 @@ def __init__(self, client):
2930
self._client = client
3031

3132
def start(self, params: StartBatchScrapeJobParams) -> StartBatchScrapeJobResponse:
33+
try:
34+
payload = params.model_dump(exclude_none=True, by_alias=True)
35+
except HyperbrowserError:
36+
raise
37+
except Exception as exc:
38+
raise HyperbrowserError(
39+
"Failed to serialize batch scrape start params",
40+
original_error=exc,
41+
) from exc
42+
if type(payload) is not dict:
43+
raise HyperbrowserError("Failed to serialize batch scrape start params")
3244
response = self._client.transport.post(
3345
self._client._build_url("/scrape/batch"),
34-
data=params.model_dump(exclude_none=True, by_alias=True),
46+
data=payload,
3547
)
3648
return parse_response_model(
3749
response.data,
@@ -141,9 +153,20 @@ def __init__(self, client):
141153
self.batch = BatchScrapeManager(client)
142154

143155
def start(self, params: StartScrapeJobParams) -> StartScrapeJobResponse:
156+
try:
157+
payload = params.model_dump(exclude_none=True, by_alias=True)
158+
except HyperbrowserError:
159+
raise
160+
except Exception as exc:
161+
raise HyperbrowserError(
162+
"Failed to serialize scrape start params",
163+
original_error=exc,
164+
) from exc
165+
if type(payload) is not dict:
166+
raise HyperbrowserError("Failed to serialize scrape start params")
144167
response = self._client.transport.post(
145168
self._client._build_url("/scrape"),
146-
data=params.model_dump(exclude_none=True, by_alias=True),
169+
data=payload,
147170
)
148171
return parse_response_model(
149172
response.data,

0 commit comments

Comments
 (0)