From 93448c6cae6b1bc97ba0dfe906e52cfa1caf260e Mon Sep 17 00:00:00 2001 From: HC-ONLINE Date: Tue, 11 Aug 2026 11:53:17 -0500 Subject: [PATCH 1/2] fix: add cookies support to HTTPClient and attack service --- src/ciberwebscan/core/client/http_client.py | 2 ++ src/ciberwebscan/services/attack_service.py | 1 + 2 files changed, 3 insertions(+) diff --git a/src/ciberwebscan/core/client/http_client.py b/src/ciberwebscan/core/client/http_client.py index a0fa3a7..b6f2451 100644 --- a/src/ciberwebscan/core/client/http_client.py +++ b/src/ciberwebscan/core/client/http_client.py @@ -263,6 +263,7 @@ def __init__( verify: bool | None = None, follow_redirects: bool | None = None, default_headers: dict[str, str] | None = None, + cookies: dict[str, str] | None = None, metrics_callback: MetricsCallback | None = None, proxy: str | None = None, retryable_status_codes: set[int] | None = None, @@ -374,6 +375,7 @@ def __init__( follow_redirects=resolved_follow_redirects, max_redirects=resolved_max_redirects, headers=default_headers, + cookies=cookies, proxy=resolved_proxy, ) diff --git a/src/ciberwebscan/services/attack_service.py b/src/ciberwebscan/services/attack_service.py index 2f647fb..1fd3e8e 100644 --- a/src/ciberwebscan/services/attack_service.py +++ b/src/ciberwebscan/services/attack_service.py @@ -364,6 +364,7 @@ def attack(self, options: AttackOptions) -> ServiceResult[AttackResult]: verify=http_config.verify_ssl, follow_redirects=http_config.follow_redirects, default_headers=default_headers or None, + cookies=options.cookies or None, proxy=self._resolve_proxy(options.proxy), ) From 4a489ef10b6507b647b8269c1f66bd6c6eaaa93d Mon Sep 17 00:00:00 2001 From: HC-ONLINE Date: Tue, 11 Aug 2026 13:17:07 -0500 Subject: [PATCH 2/2] fix: add cookies support to ScrapeService and AnalyzeService --- src/ciberwebscan/services/analyze_service.py | 6 ++++-- src/ciberwebscan/services/scrape_service.py | 22 ++++++++++++++------ tests/unit/services/test_scrape_service.py | 1 + 3 files changed, 21 insertions(+), 8 deletions(-) diff --git a/src/ciberwebscan/services/analyze_service.py b/src/ciberwebscan/services/analyze_service.py index c41ca2f..79d80ba 100644 --- a/src/ciberwebscan/services/analyze_service.py +++ b/src/ciberwebscan/services/analyze_service.py @@ -501,9 +501,10 @@ def _analyze_headers( with HTTPClient( timeout=timeout, default_headers=default_headers or None, + cookies=options.cookies or None, proxy=self._resolve_proxy(options.proxy), ) as client: - resp = client.get(url, cookies=options.cookies or None) + resp = client.get(url) response_headers = dict(resp.headers) analysis = self.headers_analyzer.analyze(response_headers) @@ -570,9 +571,10 @@ def _fingerprint( with HTTPClient( timeout=timeout, default_headers=default_headers or None, + cookies=options.cookies or None, proxy=self._resolve_proxy(options.proxy), ) as client: - resp = client.get(url, cookies=options.cookies or None) + resp = client.get(url) headers = dict(resp.headers) html = resp.text diff --git a/src/ciberwebscan/services/scrape_service.py b/src/ciberwebscan/services/scrape_service.py index 51de4a7..c860a63 100644 --- a/src/ciberwebscan/services/scrape_service.py +++ b/src/ciberwebscan/services/scrape_service.py @@ -119,6 +119,7 @@ def _build_http_client( *, proxy: str | None = None, verify: bool | None = None, + cookies: dict[str, str] | None = None, ): from ciberwebscan.core.client import HTTPClient @@ -140,6 +141,7 @@ def _build_http_client( http2=http_config.http2, verify=http_config.verify_ssl if verify is None else verify, follow_redirects=http_config.follow_redirects, + cookies=cookies, proxy=proxy, default_headers=default_headers, ) @@ -199,11 +201,18 @@ def static_scraper(self) -> StaticScraper: return self._static_scraper def _get_static_scraper_with_proxy( - self, proxy: str | None, verify_ssl: bool = True + self, + proxy: str | None, + verify_ssl: bool = True, + cookies: dict[str, str] | None = None, ) -> StaticScraper: - """Get static scraper with specific proxy configuration.""" - if proxy or not verify_ssl: - client = self._build_http_client(proxy=proxy, verify=verify_ssl) + """Get static scraper with specific proxy/cookies configuration.""" + if proxy or not verify_ssl or cookies: + client = self._build_http_client( + proxy=proxy, + verify=verify_ssl, + cookies=cookies, + ) return StaticScraper( client, proxy_rotator=self._proxy_rotator, @@ -363,13 +372,14 @@ def _scrape_static(self, url: str, options: ScrapeOptions) -> ScrapeResult: schema=options.schema, timeout=timeout, headers=options.headers or None, - cookies=options.cookies or None, check_robots=options.check_robots, extract_forms=options.extract_forms, ) core_result: CoreScrapeResult = self._get_static_scraper_with_proxy( - options.proxy, config.verify_ssl + options.proxy, + config.verify_ssl, + cookies=options.cookies or None, ).scrape(url, config) # Map core ScrapeResult to export ScrapeResult diff --git a/tests/unit/services/test_scrape_service.py b/tests/unit/services/test_scrape_service.py index 56e43e4..7f766d0 100644 --- a/tests/unit/services/test_scrape_service.py +++ b/tests/unit/services/test_scrape_service.py @@ -220,6 +220,7 @@ def test_static_scraper_uses_http_config( http2=False, verify=False, follow_redirects=False, + cookies=None, proxy=None, default_headers={"User-Agent": "TestAgent"}, )