Skip to content

Commit 353b22c

Browse files
committed
fix: possible infinity loop in Apify-Scrapy proxy middleware
1 parent ed5ab3b commit 353b22c

File tree

2 files changed

+8
-20
lines changed

2 files changed

+8
-20
lines changed

src/apify/scrapy/middlewares/apify_proxy.py

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ def process_exception(
9393
request: Request,
9494
exception: Exception,
9595
spider: Spider,
96-
) -> None | Request:
96+
) -> None:
9797
"""Process an exception that occurs during request processing.
9898
9999
Args:
@@ -102,8 +102,9 @@ def process_exception(
102102
spider: Scrapy Spider object.
103103
104104
Returns:
105-
If a TunnelError occurs, return the request object to halt its processing in the middleware pipeline.
106-
Return None otherwise to allow the continuation of request processing.
105+
Returning None, meaning Scrapy will continue processing this exception, executing any other
106+
process_exception() methods of installed middleware, until no middleware is left and the default
107+
exception handling kicks in.
107108
"""
108109
Actor.log.debug(
109110
f'ApifyHttpProxyMiddleware.process_exception: request={request}, exception={exception}, spider={spider}',
@@ -114,9 +115,6 @@ def process_exception(
114115
f'ApifyHttpProxyMiddleware: TunnelError occurred for request="{request}", '
115116
'reason="{exception}", skipping...'
116117
)
117-
return request
118-
119-
return None
120118

121119
async def _get_new_proxy_url(self: ApifyHttpProxyMiddleware) -> ParseResult:
122120
"""Get a new proxy URL.

tests/unit/scrapy/middlewares/test_apify_proxy.py

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -129,24 +129,14 @@ async def mock_get_new_proxy_url() -> ParseResult:
129129

130130

131131
@pytest.mark.parametrize(
132-
('exception', 'none_returned_values_is_expected'),
133-
[
134-
(TunnelError(), False),
135-
(ValueError(), True),
136-
],
132+
'exception',
133+
[TunnelError(), ValueError()],
137134
)
138135
def test__process_exception(
139136
middleware: ApifyHttpProxyMiddleware,
140137
spider: DummySpider,
141138
dummy_request: Request,
142139
exception: Exception,
143-
*,
144-
none_returned_values_is_expected: bool,
145140
) -> None:
146-
returned_value = middleware.process_exception(dummy_request, exception, spider)
147-
148-
if none_returned_values_is_expected:
149-
assert returned_value is None
150-
151-
else:
152-
assert returned_value == dummy_request
141+
returned_value = middleware.process_exception(dummy_request, exception, spider) # type: ignore
142+
assert returned_value is None

0 commit comments

Comments
 (0)