Skip to main content

RequestBuilder

Struct RequestBuilder 

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

Fluent outbound request builder produced by Client methods.

Implementations§

Source§

impl RequestBuilder

Source

pub fn header(self, name: impl AsRef<str>, value: impl AsRef<str>) -> Self

Append a request header.

Headers named authorization, cookie, or set-cookie are accepted normally but are redacted in tracing events and log output. Invalid header names or values emit a tracing::warn! and are skipped.

Source

pub fn json<T: Serialize>(self, body: &T) -> Self

Serialise body as JSON and set Content-Type: application/json.

Serialisation errors are captured and returned when send is called rather than being silently discarded.

Source

pub fn text_body(self, body: impl Into<String>) -> Self

Set a plain-text body.

Source

pub const fn retries(self, max: u32) -> Self

Override the maximum retry count for this request.

Also clears the idempotent-only flag so non-idempotent methods such as POST and PATCH are retried when the caller explicitly requests it.

Source

pub const fn max_retry_after(self, max: Duration) -> Self

Override the maximum Retry-After sleep duration for this request.

Source

pub const fn no_retry(self) -> Self

Disable retries for this request.

Source

pub fn no_redirect(self) -> Self

Disable redirect following for this request.

A 3xx response is returned to the caller verbatim (status, headers and body) rather than being followed. Routes the request through the custom one-shot-client send path, which bypasses the process-wide circuit breaker.

Source

pub fn follow_redirects<F>(self, max: usize, validator: F) -> Self
where F: Fn(&str) -> bool + Send + Sync + 'static,

Follow up to max redirects, validating each hop before following it.

Before following a 3xx, the Location header is resolved to an absolute URL (relative locations are joined against the current URL) and validator(&absolute_location) is called. If it returns false the request fails with ClientError::RedirectRejected. If the chain would exceed max hops the request fails with ClientError::TooManyRedirects (so max == 0 turns the first 3xx into an error). Routes the request through the custom one-shot-client send path, which bypasses the process-wide circuit breaker.

TOCTOU / rebinding limitation. The validator receives the redirect target as a string (not a resolved IP), and the subsequent connection re-resolves that host via normal DNS. So a validator that inspects IP literals sees only literal hosts, has a connect-time TOCTOU window against a hostname that re-resolves between check and connect, and provides no address pinning. When you need pinned, rebind-safe following that validates every resolved IP and pins the connection per hop, use Client::get_ssrf_safe instead.

Source

pub const fn pin_to(self, addr: SocketAddr) -> Self

Pin the connection to addr, skipping DNS resolution.

The original Host header and TLS SNI are preserved; only the address the socket connects to is overridden. This protects against DNS-rebinding / TOCTOU attacks where a hostname re-resolves to a different (private) address between validation and connection.

Requires a domain (hostname) URL host. The pin is enforced via a DNS resolve override, but reqwest/hyper treat an IP-literal URL host as already-resolved and never consult the resolver — so the override is skipped and the socket would connect to the literal in the URL, not the pinned address. A pin_to request whose URL host is an IP literal (IPv4 or IPv6) is therefore rejected at send time with ClientError::PinRequiresDomainHost. Put the desired IP directly in the URL (no pin needed), or use a domain host.

Pinning applies to the initial connection only. Redirects are not followed under pin_to: a 3xx is returned to the caller verbatim (as if no_redirect were set) rather than being auto-followed to a possibly-different host that would be re-resolved via normal DNS, silently escaping the pin. If you need pinned, rebind-safe per-hop following, use Client::get_ssrf_safe instead.

Cannot be combined with follow_redirects. Because the pin only covers the first hop while later hops would re-resolve via DNS, chaining pin_to with follow_redirects (in either order) is rejected at send time with ClientError::IncompatiblePinRedirect rather than silently following a redirect off the pinned address. Use Client::get_ssrf_safe for pinned, per-hop-revalidated redirect following, pin_to alone (which returns the 3xx unfollowed), or follow_redirects without pin_to.

Implemented via a one-shot reqwest::ClientBuilder::resolve(host, addr) scoped to this request. Note that reqwest ignores the port in the resolve override and connects to the port from the request URL, so addr.port() is only honoured when it matches the URL’s port (which it does for addresses obtained by resolving that same URL). Routes the request through the custom one-shot-client send path, which bypasses the process-wide circuit breaker.

Env proxies are bypassed. The pinned client is built with .no_proxy(), so HTTP_PROXY / HTTPS_PROXY / ALL_PROXY are ignored and the socket connects directly to addr. This is required for the pin to hold: reqwest checks proxy interception before the connector where the resolve() override applies, so a configured proxy would otherwise receive the request and re-resolve the host — defeating the pin.

Source

pub async fn send(self) -> Result<Response, ClientError>

Send the request, applying retries and returning a Response.

§Errors

Returns ClientError::Json if a prior .json() call failed to serialise the body. Returns ClientError::Request for transport errors that exhaust all retry attempts. Returns ClientError::NoMock if the request is made in a test context without a matching mock entry.

§Panics

Contains an internal unreachable!() that guards against a logic error in the retry loop; it cannot be reached in practice.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> AggregateExpressionMethods for T

Source§

fn aggregate_distinct(self) -> Self::Output
where Self: DistinctDsl,

DISTINCT modifier for aggregate functions Read more
Source§

fn aggregate_all(self) -> Self::Output
where Self: AllDsl,

ALL modifier for aggregate functions Read more
Source§

fn aggregate_filter<P>(self, f: P) -> Self::Output
where P: AsExpression<Bool>, Self: FilterDsl<<P as AsExpression<Bool>>::Expression>,

Add an aggregate function filter Read more
Source§

fn aggregate_order<O>(self, o: O) -> Self::Output
where Self: OrderAggregateDsl<O>,

Add an aggregate function order Read more
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> AutumnDependents for T
where T: ?Sized,

Source§

fn dependents() -> &'static [RuntimeDependentSpec]

The model’s dependent-cascade specs, in declaration order. Defaults to none; #[model] overrides via an inherent shadow when dependents exist.
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> Downcast for T
where T: Any,

Source§

fn into_any(self: Box<T>) -> Box<dyn Any>

Converts Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>, which can then be downcast into Box<dyn ConcreteType> where ConcreteType implements Trait.
Source§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Converts Rc<Trait> (where Trait: Downcast) to Rc<Any>, which can then be further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
Source§

fn as_any(&self) -> &(dyn Any + 'static)

Converts &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
Source§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Converts &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
Source§

impl<T> DowncastSend for T
where T: Any + Send,

Source§

fn into_any_send(self: Box<T>) -> Box<dyn Any + Send>

Converts Box<Trait> (where Trait: DowncastSend) to Box<dyn Any + Send>, which can then be downcast into Box<ConcreteType> where ConcreteType implements Trait.
Source§

impl<T> DowncastSync for T
where T: Any + Send + Sync,

Source§

fn into_any_sync(self: Box<T>) -> Box<dyn Any + Sync + Send>

Converts Box<Trait> (where Trait: DowncastSync) to Box<dyn Any + Send + Sync>, which can then be downcast into Box<ConcreteType> where ConcreteType implements Trait.
Source§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Sync + Send>

Converts Arc<Trait> (where Trait: DowncastSync) to Arc<Any>, which can then be downcast into Arc<ConcreteType> where ConcreteType implements Trait.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<A, B, T> HttpServerConnExec<A, B> for T
where B: Body,

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> IntoSql for T

Source§

fn into_sql<T>(self) -> Self::Expression

Convert self to an expression for Diesel’s query builder. Read more
Source§

fn as_sql<'a, T>(&'a self) -> <&'a Self as AsExpression<T>>::Expression
where &'a Self: AsExpression<T>, T: SqlType + TypedExpressionType,

Convert &self to an expression for Diesel’s query builder. 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, Conn> RunQueryDsl<Conn> for T

Source§

fn execute<'conn, 'query>( self, conn: &'conn mut Conn, ) -> <Conn as AsyncConnectionCore>::ExecuteFuture<'conn, 'query>
where Conn: AsyncConnectionCore + Send, Self: ExecuteDsl<Conn> + 'query,

Executes the given command, returning the number of rows affected. Read more
Source§

fn load<'query, 'conn, U>( self, conn: &'conn mut Conn, ) -> AndThen<Self::LoadFuture<'conn>, TryCollect<Self::Stream<'conn>, Vec<U>>>
where U: Send, Conn: AsyncConnectionCore, Self: LoadQuery<'query, Conn, U> + 'query,

Executes the given query, returning a Vec with the returned rows. Read more
Source§

fn load_stream<'conn, 'query, U>( self, conn: &'conn mut Conn, ) -> Self::LoadFuture<'conn>
where Conn: AsyncConnectionCore, U: 'conn, Self: LoadQuery<'query, Conn, U> + 'query,

Executes the given query, returning a [Stream] with the returned rows. Read more
Source§

fn get_result<'query, 'conn, U>( self, conn: &'conn mut Conn, ) -> AndThen<Self::LoadFuture<'conn>, LoadNext<Pin<Box<Self::Stream<'conn>>>>>
where U: Send + 'conn, Conn: AsyncConnectionCore, Self: LoadQuery<'query, Conn, U> + 'query,

Runs the command, and returns the affected row. Read more
Source§

fn get_results<'query, 'conn, U>( self, conn: &'conn mut Conn, ) -> AndThen<Self::LoadFuture<'conn>, TryCollect<Self::Stream<'conn>, Vec<U>>>
where U: Send, Conn: AsyncConnectionCore, Self: LoadQuery<'query, Conn, U> + 'query,

Runs the command, returning an Vec with the affected rows. Read more
Source§

fn first<'query, 'conn, U>( self, conn: &'conn mut Conn, ) -> AndThen<<Self::Output as LoadQuery<'query, Conn, U>>::LoadFuture<'conn>, LoadNext<Pin<Box<<Self::Output as LoadQuery<'query, Conn, U>>::Stream<'conn>>>>>
where U: Send + 'conn, Conn: AsyncConnectionCore, Self: LimitDsl, Self::Output: LoadQuery<'query, Conn, U> + Send + 'query,

Attempts to load a single record. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> Scoped for T
where T: Send + Sync + 'static,

Source§

fn scope(ctx: &PolicyContext) -> ScopeQuery<'_, Self>

Open a deferred ScopeQuery for this type. Resolves the registered scope at .load() time, not here.
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> WindowExpressionMethods for T

Source§

fn over(self) -> Self::Output
where Self: OverDsl,

Turn a function call into a window function call Read more
Source§

fn window_filter<P>(self, f: P) -> Self::Output
where P: AsExpression<Bool>, Self: FilterDsl<<P as AsExpression<Bool>>::Expression>,

Add a filter to the current window function Read more
Source§

fn partition_by<E>(self, expr: E) -> Self::Output
where Self: PartitionByDsl<E>,

Add a partition clause to the current window function Read more
Source§

fn window_order<E>(self, expr: E) -> Self::Output
where Self: OrderWindowDsl<E>,

Add a order clause to the current window function Read more
Source§

fn frame_by<E>(self, expr: E) -> Self::Output
where Self: FrameDsl<E>,

Add a frame clause to the current window function Read more
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