stealthreq 0.1.0

Trait-driven, human-like request mutation primitives for crawlers and scrapers.
Documentation
use stealthreq::{MutableRequest, RequestModifier, StealthPolicy};

struct ReqwestAdapter {
    builder: Option<reqwest::RequestBuilder>,
}

impl MutableRequest for ReqwestAdapter {
    fn set_header(&mut self, name: &str, value: &str) {
        let current = self
            .builder
            .take()
            .expect("request builder should be available");
        self.builder = Some(current.header(name, value));
    }
}

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let client = reqwest::Client::new();
    let mut adapter = ReqwestAdapter { builder: Some(client.get("https://example.com")) };

    let policy = StealthPolicy::default().with_seed(Some(42));
    let _ = policy.apply(&mut adapter)?;

    let request = adapter.builder.take().expect("builder is prepared").build()?;
    println!("prepared request method={} uri={}", request.method(), request.url());

    let _response = client.execute(request).await?;
    Ok(())
}