Skip to main content

HttpClient

Struct HttpClient 

Source
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

Source

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).

Source

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.

Source

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.

Source

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.

Source

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.

Source

pub fn inner(&self) -> &Client

Returns a reference to the inner reqwest::Client.

Source

pub fn config(&self) -> &HttpClientConfig

Returns a reference to the client configuration.

Source

pub async fn fetch_stream<F>( &self, url: &Url, on_chunk: F, ) -> Result<FetchResult, CrawlError>
where F: FnMut(&str) + Send,

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.

Source

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§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts 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
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> PolicyExt for T
where T: ?Sized,

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
Source§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more