Skip to main content

RedirectConfig

Struct RedirectConfig 

Source
pub struct RedirectConfig {
    pub max_redirects: usize,
    pub same_origin_only: bool,
    pub allowed_redirect_hosts: HashSet<String>,
    pub strip_sensitive_headers: bool,
    pub allow_https_downgrade: bool,
}
Expand description

Configuration for redirect behavior

Controls how the HTTP client handles 3xx redirect responses with security protections.

§Security Features

  • Same-origin enforcement: By default, only follows redirects to the same host
  • Header stripping: Removes Authorization, Cookie on cross-origin redirects
  • Downgrade protection: Blocks HTTPS → HTTP redirects
  • Host allow-list: Configurable list of trusted redirect targets

§Example

use modkit_http::RedirectConfig;
use std::collections::HashSet;

// Permissive mode for general-purpose clients
let config = RedirectConfig::permissive();

// Custom allow-list for trusted hosts
let config = RedirectConfig {
    same_origin_only: true,
    allowed_redirect_hosts: HashSet::from(["cdn.example.com".to_string()]),
    ..Default::default()
};

Fields§

§max_redirects: usize

Maximum number of redirects to follow (default: 10)

Set to 0 to disable redirect following entirely.

§same_origin_only: bool

Only allow same-origin redirects (default: true)

When true, redirects to different hosts are blocked unless the target host is in allowed_redirect_hosts.

Security: This is the safest default, preventing SSRF attacks where a malicious server redirects requests to internal services.

§allowed_redirect_hosts: HashSet<String>

Hosts that are allowed as redirect targets even when same_origin_only is true

Use this to allow redirects to known, trusted hosts (e.g., CDN domains, authentication servers).

Note: Entries should be hostnames only, without scheme or port. Example: "cdn.example.com", not "https://cdn.example.com".

§strip_sensitive_headers: bool

Strip sensitive headers on cross-origin redirects (default: true)

When a redirect goes to a different origin (even if allowed), this removes:

  • Authorization header (prevents credential leakage)
  • Cookie header (prevents session hijacking)
  • Proxy-Authorization header

Security: Always keep this enabled unless you have specific requirements.

§allow_https_downgrade: bool

Allow HTTPS → HTTP downgrades (default: false)

When false, redirects from HTTPS to HTTP are blocked.

Security: Downgrades expose traffic to interception. Only enable for testing with local mock servers.

Implementations§

Source§

impl RedirectConfig

Source

pub fn permissive() -> Self

Create a permissive configuration that allows all redirects with header stripping

This is suitable for general-purpose HTTP clients that need to follow redirects to any host, but still want protection against credential leakage.

Note: This configuration still blocks HTTPS → HTTP downgrades.

Source

pub fn disabled() -> Self

Create a configuration that disables redirect following

Source

pub fn for_testing() -> Self

Create a configuration for testing (allows HTTP, permissive)

WARNING: Only use for local testing with mock servers.

Trait Implementations§

Source§

impl Clone for RedirectConfig

Source§

fn clone(&self) -> RedirectConfig

Returns a duplicate of the value. Read more
1.0.0 · Source§

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

Performs copy-assignment from source. Read more
Source§

impl Debug for RedirectConfig

Source§

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

Formats the value using the given formatter. Read more
Source§

impl Default for RedirectConfig

Source§

fn default() -> Self

Returns the “default value” for a type. 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> ServiceExt for T

Source§

fn decompression(self) -> Decompression<Self>
where Self: Sized,

Decompress response bodies. Read more
Source§

fn trace_for_http(self) -> Trace<Self, SharedClassifier<ServerErrorsAsFailures>>
where Self: Sized,

High level tracing that classifies responses using HTTP status codes. Read more
Source§

fn trace_for_grpc(self) -> Trace<Self, SharedClassifier<GrpcErrorsAsFailures>>
where Self: Sized,

High level tracing that classifies responses using gRPC headers. Read more
Source§

fn follow_redirects(self) -> FollowRedirect<Self>
where Self: Sized,

Follow redirect resposes using the Standard policy. Read more
Source§

fn set_request_id<M>( self, header_name: HeaderName, make_request_id: M, ) -> SetRequestId<Self, M>
where Self: Sized, M: MakeRequestId,

Add request id header and extension. Read more
Source§

fn set_x_request_id<M>(self, make_request_id: M) -> SetRequestId<Self, M>
where Self: Sized, M: MakeRequestId,

Add request id header and extension, using x-request-id as the header name. Read more
Source§

fn propagate_request_id( self, header_name: HeaderName, ) -> PropagateRequestId<Self>
where Self: Sized,

Propgate request ids from requests to responses. Read more
Source§

fn propagate_x_request_id(self) -> PropagateRequestId<Self>
where Self: Sized,

Propgate request ids from requests to responses, using x-request-id as the header name. Read more
Source§

fn request_body_limit(self, limit: usize) -> RequestBodyLimit<Self>
where Self: Sized,

Intercept requests with over-sized payloads and convert them into 413 Payload Too Large responses. Read more
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