Skip to main content

Client

Struct Client 

Source
pub struct Client { /* private fields */ }
Expand description

HTTP client used to probe sites.

Cheap to clone — the underlying reqwest::Client is reference-counted internally, and the throttle is Arc-backed, so cloning is the recommended way to share a client between tasks. Cloned clients share throttle state, which is what you want: a fan-out scan must not accidentally exceed a per-host budget by spawning more clients.

Implementations§

Source§

impl Client

Source

pub fn builder() -> ClientBuilder

Start configuring a new client.

Source

pub fn egress_summary(&self) -> Vec<EgressSummary>

Read-only view of the configured egress pool — (country, kind) for every registered proxy, in the order they were declared. Proxy URLs are not surfaced (they typically carry credentials), so this is safe to serialise to a JSON response.

Source

pub fn session_names(&self) -> Vec<String>

Names of the configured sessions (sorted lexicographically), without any header values. Useful for a UI listing which session keys an operator can reference via access.session on a site.

Source

pub fn egress_names(&self) -> Vec<String>

Names of the configured egresses (in registration order, only those that supplied a name). Used by the server to validate per-scan egress_names against the loaded pool.

Source

pub fn with_egress_subset(&self, names: &[String]) -> Self

Returns a new client identical to this one except its egress pool is restricted to entries whose name matches one of names. An empty names slice is treated as “no filter” and returns a clone of the full pool.

Cheap to call repeatedly: all shared state (HTTP clients, throttle, sessions, budgets, browser backend, …) is Arc-cloned so the returned client shares the parent’s per-scan caps (browser budget, escalation budget, throttle state) rather than each subset getting a fresh one. This is the right behaviour for a single web-server instance handing out per-request clients.

Source

pub async fn check(&self, site: &Site, username: &Username) -> CheckOutcome

Probe a single site for username, retrying on transient bans.

Network failures, timeouts, and unexpected response shapes all yield MatchKind::Uncertain with a descriptive note. The method never returns an error: at the executor level we want a partial result for every site, not abort-on-first-failure semantics.

When ban detection classifies a response as rate_limited / cloudflare_challenge, the call is retried with jittered exponential backoff (configurable via ClientBuilder::max_retries). Non-ban Uncertain (network errors, body read failures) is not retried — those failures rarely fix themselves in the seconds-to-minutes window we’d block for.

Source

pub async fn fetch(&self, url: &str) -> Option<RawResponse>

Fetch a URL and return raw response data (status, final URL, body) with the same throttle / User-Agent / proxy machinery as check, but without signal evaluation or retry.

Returns None on any network/transport error. Intended for diagnostics such as adler --doctor --fix, which diffs the responses for a known-present and a nonsense user to derive a signature.

Source

pub async fn fetch_for_doctor( &self, site: &Site, url: &str, ) -> Option<RawResponse>

Same as Self::fetch but routes through the configured browser backend when the site is tagged bot-protected and a backend is available. Used by doctor::suggest_fix so that the diff-derivation works against the JS-rendered page (login wall vs. real profile) rather than two identical raw-HTTP shells.

Falls back to raw HTTP if (a) no browser is configured, (b) the site isn’t bot-protected, or (c) the browser fetch fails — so callers get the same Option<RawResponse> shape either way.

Trait Implementations§

Source§

impl Clone for Client

Source§

fn clone(&self) -> Client

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Client

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

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<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
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> PolicyExt for T
where T: ?Sized,

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: 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: 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> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
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<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

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