feat(crawler): plumb TorController through FetchContext and pipelines
Adds CRAWLER_TOR_CONTROL_URL / _PASSWORD / _COOKIE_PATH / _RECIRCUIT_MAX_ATTEMPTS to CrawlerConfig and to bin/crawler.rs's env reads. Constructs an Option<Arc<TorController>> at daemon / CLI startup and threads it through FetchContext, pipeline::run_metadata_pass, and content::sync_chapter_content as Option<&TorController>. Pure scaffolding — the controller isn't used yet; behavior is unchanged. Next commit wires the retry hooks and session-probe recircuit. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -97,6 +97,20 @@ pub struct CrawlerConfig {
|
||||
pub cookie_domain: Option<String>,
|
||||
pub user_agent: Option<String>,
|
||||
pub proxy: Option<String>,
|
||||
/// `tcp://host:port`, `host:port`, or bare `host` (default port
|
||||
/// 9051). When `None`, TOR-recircuit-on-transient is disabled and
|
||||
/// the crawler behaves identically to pre-TOR releases.
|
||||
pub tor_control_url: Option<String>,
|
||||
/// HashedControlPassword auth. Used only when
|
||||
/// `tor_control_cookie_path` is `None`.
|
||||
pub tor_control_password: Option<String>,
|
||||
/// Cookie-file auth path (e.g.
|
||||
/// `/var/lib/tor/control_auth_cookie`). Takes precedence over
|
||||
/// password when both are set.
|
||||
pub tor_control_cookie_path: Option<PathBuf>,
|
||||
/// Maximum NEWNYM-and-retry cycles per recircuit-eligible failure.
|
||||
/// Defaults to 3.
|
||||
pub tor_recircuit_max_attempts: u32,
|
||||
pub browser: LaunchOptions,
|
||||
/// Hosts the crawler is allowed to download images / covers from.
|
||||
/// Always seeded with the host of `start_url` and (when set) the
|
||||
@@ -124,6 +138,10 @@ impl Default for CrawlerConfig {
|
||||
cookie_domain: None,
|
||||
user_agent: None,
|
||||
proxy: None,
|
||||
tor_control_url: None,
|
||||
tor_control_password: None,
|
||||
tor_control_cookie_path: None,
|
||||
tor_recircuit_max_attempts: 3,
|
||||
browser: LaunchOptions::headless(),
|
||||
download_allowlist: DownloadAllowlist::new(),
|
||||
max_image_bytes: DEFAULT_MAX_IMAGE_BYTES,
|
||||
@@ -234,6 +252,18 @@ impl CrawlerConfig {
|
||||
proxy: std::env::var("CRAWLER_PROXY")
|
||||
.ok()
|
||||
.filter(|s| !s.trim().is_empty()),
|
||||
tor_control_url: std::env::var("CRAWLER_TOR_CONTROL_URL")
|
||||
.ok()
|
||||
.filter(|s| !s.trim().is_empty()),
|
||||
tor_control_password: std::env::var("CRAWLER_TOR_CONTROL_PASSWORD")
|
||||
.ok()
|
||||
.filter(|s| !s.trim().is_empty()),
|
||||
tor_control_cookie_path: std::env::var("CRAWLER_TOR_CONTROL_COOKIE_PATH")
|
||||
.ok()
|
||||
.filter(|s| !s.trim().is_empty())
|
||||
.map(PathBuf::from),
|
||||
tor_recircuit_max_attempts: env_u64("CRAWLER_TOR_RECIRCUIT_MAX_ATTEMPTS", 3)
|
||||
.max(1) as u32,
|
||||
browser: LaunchOptions::from_env(),
|
||||
download_allowlist,
|
||||
max_image_bytes: env_usize("CRAWLER_MAX_IMAGE_BYTES", DEFAULT_MAX_IMAGE_BYTES),
|
||||
|
||||
Reference in New Issue
Block a user