Fix robots.txt not being applied to concurrent requests for a new host.
This commit is contained in:
1 parent
6675a8b884
commit
bb8dc829ef
2 files changed
+26
-1
No files matched your search
@@ -113,7 +113,17 @@ class RobotsTxtMiddleware:
|
|||||||
|
|
||||||
parser = self._parsers[netloc]
|
parser = self._parsers[netloc]
|
||||||
if isinstance(parser, Deferred):
|
if isinstance(parser, Deferred):
|
||||||
return await maybe_deferred_to_future(parser)
|
# Awaiting a Deferred consumes its result, so every request waiting
|
||||||
|
# for this robots.txt gets its own Deferred, fired by a callback
|
||||||
|
# that also passes the result on to the next waiter.
|
||||||
|
waiter: Deferred[RobotParser | None] = Deferred()
|
||||||
|
|
||||||
|
def notify_waiter(rp: RobotParser | None) -> RobotParser | None:
|
||||||
|
waiter.callback(rp)
|
||||||
|
return rp
|
||||||
|
|
||||||
|
parser.addCallback(notify_waiter)
|
||||||
|
return await maybe_deferred_to_future(waiter)
|
||||||
return parser
|
return parser
|
||||||
|
|
||||||
async def _parse_robots(
|
async def _parse_robots(
|
||||||
|
|||||||
@@ -113,6 +113,21 @@ Disallow: /some/randome/page.html
|
|||||||
c2 = middleware.process_request(Request("http://site.local/allowed2"))
|
c2 = middleware.process_request(Request("http://site.local/allowed2"))
|
||||||
await asyncio.gather(c1, c2)
|
await asyncio.gather(c1, c2)
|
||||||
|
|
||||||
|
@coroutine_test
|
||||||
|
async def test_robotstxt_multiple_reqs_forbidden(self) -> None:
|
||||||
|
middleware = build_from_crawler(
|
||||||
|
RobotsTxtMiddleware, self._get_successful_crawler()
|
||||||
|
)
|
||||||
|
dfds = [
|
||||||
|
deferred_from_coro(
|
||||||
|
middleware.process_request(Request(f"http://site.local/admin/{i}"))
|
||||||
|
)
|
||||||
|
for i in range(3)
|
||||||
|
]
|
||||||
|
for dfd in dfds:
|
||||||
|
with pytest.raises(IgnoreRequest):
|
||||||
|
await maybe_deferred_to_future(dfd)
|
||||||
|
|
||||||
@coroutine_test
|
@coroutine_test
|
||||||
async def test_robotstxt_ready_parser(self):
|
async def test_robotstxt_ready_parser(self):
|
||||||
middleware = build_from_crawler(
|
middleware = build_from_crawler(
|
||||||
|
|||||||
Reference in new issue
Block a user