From 8753c63f77a1b89df92f43b59ec5a2c7a091dc70 Mon Sep 17 00:00:00 2001 From: mkilijanek Date: Mon, 9 Mar 2026 09:12:18 +0100 Subject: [PATCH] perf(origin): add bounded scanner concurrency and timeout control (cherry picked from commit 669a1a53170bd60ad338e99fcc7a5d7ca50b66af) --- chemistry/origin_server_ip.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/chemistry/origin_server_ip.py b/chemistry/origin_server_ip.py index a40f37d..713dd2d 100644 --- a/chemistry/origin_server_ip.py +++ b/chemistry/origin_server_ip.py @@ -1162,12 +1162,16 @@ def __init__( enrich: bool = True, extra_waf_ranges: Optional[list[str]] = None, manual_ip: Optional[str] = None, + scanner_concurrency: int = 4, + scanner_timeout: float = 90.0, ): self.domain = domain.lower().strip() self._verify = verify self._enrich = enrich self._extra_waf_ranges = extra_waf_ranges or [] self._manual_ip = manual_ip + self._scanner_concurrency = max(1, scanner_concurrency) + self._scanner_timeout = max(5.0, scanner_timeout) self._report = ReconReport(target=self.domain) self._verifier = OriginVerifier(self.domain) self._enricher = IPEnricher() @@ -1218,11 +1222,17 @@ async def hunt(self) -> ReconReport: self._report.waf_vendor = vendor self._report.waf_names = names + sem = asyncio.Semaphore(self._scanner_concurrency) + async def run_scanner(scanner): try: - results = await scanner.scan() + async with sem: + results = await asyncio.wait_for( + scanner.scan(), + timeout=self._scanner_timeout, + ) await self._correlator.feed(results, self._report) - except Exception: + except (asyncio.TimeoutError, Exception): pass await asyncio.gather(*[run_scanner(s) for s in self._scanners])