pub struct HttpClient { /* private fields */ }Expand description
An HTTP client with retry, redirect tracking, and user-agent rotation.
Built on top of reqwest::Client with additional features for web crawling:
- Manual redirect following with hop recording
- Exponential backoff retry for transient failures
- User-agent rotation across requests
- Response body size limiting
- Streaming responses
§Examples
use crawlkit_engine::{CrawlConfig, HttpClient};
use url::Url;
let client = HttpClient::from_crawl_config(&CrawlConfig::default())?;
let url = Url::parse("https://example.com")?;
let result = client.fetch(&url).await?;
assert_eq!(result.status_code, 200);Implementations§
Source§impl HttpClient
impl HttpClient
Sourcepub fn new(config: HttpClientConfig) -> Result<Self, CrawlError>
pub fn new(config: HttpClientConfig) -> Result<Self, CrawlError>
Creates a new HttpClient from the given configuration.
Builds a reqwest::Client with TLS, HTTP/2 multiplexing, connection
pooling, and redirect policy.
§Errors
Returns CrawlError::RequestFailed if the underlying reqwest client
cannot be built (e.g., invalid TLS configuration).
Sourcepub fn from_crawl_config(config: &CrawlConfig) -> Result<Self, CrawlError>
pub fn from_crawl_config(config: &CrawlConfig) -> Result<Self, CrawlError>
Creates a new HttpClient from a CrawlConfig.
Convenience method that converts the crawl config into an
HttpClientConfig and builds the client.
§Errors
Returns CrawlError::RequestFailed if the client cannot be built.
Sourcepub fn high_throughput(config: HttpClientConfig) -> Result<Self, CrawlError>
pub fn high_throughput(config: HttpClientConfig) -> Result<Self, CrawlError>
Creates a new HttpClient optimized for high-throughput crawling.
Enables HTTP/2, larger connection pools, and TCP keepalive.
Sourcepub async fn fetch(&self, url: &Url) -> Result<FetchResult, CrawlError>
pub async fn fetch(&self, url: &Url) -> Result<FetchResult, CrawlError>
Fetches a URL with retry logic and redirect tracking.
Returns a FetchResult with the final URL, status, headers, and body.
Follows redirects manually to record each hop in the chain.
§Errors
Returns CrawlError::RequestFailed on network errors after retries
are exhausted, or CrawlError::TooManyRedirects if the redirect
limit is exceeded.
Sourcepub async fn fetch_with_redirects(
&self,
url: &Url,
max_hops: usize,
) -> Result<FetchResult, CrawlError>
pub async fn fetch_with_redirects( &self, url: &Url, max_hops: usize, ) -> Result<FetchResult, CrawlError>
Fetches a URL, following up to max_hops redirects manually.
Each redirect hop is recorded. If the hop limit is exceeded,
CrawlError::TooManyRedirects is returned.
§Errors
Returns errors for network failures or exceeded redirect limits.
Sourcepub fn config(&self) -> &HttpClientConfig
pub fn config(&self) -> &HttpClientConfig
Returns a reference to the client configuration.
Sourcepub async fn fetch_stream<F>(
&self,
url: &Url,
on_chunk: F,
) -> Result<FetchResult, CrawlError>
pub async fn fetch_stream<F>( &self, url: &Url, on_chunk: F, ) -> Result<FetchResult, CrawlError>
Fetches a URL and streams the response body, calling the callback with each chunk.
This is useful for large pages where you want to process HTML as it arrives rather than buffering the entire response in memory.
§Errors
Returns errors for network failures or redirect limit exceeded.
Sourcepub async fn fetch_reader(
&self,
url: &Url,
) -> Result<FetchStreamReader, CrawlError>
pub async fn fetch_reader( &self, url: &Url, ) -> Result<FetchStreamReader, CrawlError>
Fetches a URL and returns the response as a streaming reader.
Returns the response metadata (status, headers) and a streaming body.
The caller can read chunks from the stream via FetchStreamReader::next_chunk.
§Errors
Returns errors for network failures.
Auto Trait Implementations§
impl !RefUnwindSafe for HttpClient
impl !UnwindSafe for HttpClient
impl Freeze for HttpClient
impl Send for HttpClient
impl Sync for HttpClient
impl Unpin for HttpClient
impl UnsafeUnpin for HttpClient
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more