Struct GetForwardedHeaderLayer
pub struct GetForwardedHeaderLayer<T = Forwarded> { /* private fields */ }
Expand description
Layer to extract Forwarded
information from the specified T
headers.
This layer can be used to extract the Forwarded
information from any specified header T
,
as long as the header implements the ForwardHeader
trait.
The following headers are supported by default:
GetForwardedHeaderLayer::forwarded
: The standardForwarded
headerRFC 7239
.GetForwardedHeaderLayer::via
: The canonicalVia
headerRFC 7230
.GetForwardedHeaderLayer::x_forwarded_for
: The canonical [X-Forwarded-For
] headerRFC 7239
.GetForwardedHeaderLayer::x_forwarded_host
: The canonical [X-Forwarded-Host
] headerRFC 7239
.GetForwardedHeaderLayer::x_forwarded_proto
: The canonical [X-Forwarded-Proto
] headerRFC 7239
.
Rama also has the following headers already implemented for you to use:
X-Real-Ip
,X-Client-Ip
,Client-Ip
,Cf-Connecting-Ip
andTrue-Client-Ip
.
There are no GetForwardedHeaderLayer
constructors for these headers,
but you can use the GetForwardedHeaderLayer::new
constructor and pass the header type as a type parameter,
alone or in a tuple with other headers.
§Example
This example shows you can extract the client IP from the X-Forwarded-For
header in case your application is behind a proxy which sets this header.
use rama_core::{
service::service_fn,
Context, Service, Layer,
};
use rama_http::{headers::forwarded::Forwarded, layer::forwarded::GetForwardedHeaderLayer, Request};
use std::{convert::Infallible, net::IpAddr};
#[tokio::main]
async fn main() {
let service = GetForwardedHeaderLayer::x_forwarded_for()
.into_layer(service_fn(async |ctx: Context, _| {
let forwarded = ctx.get::<rama_net::forwarded::Forwarded>().unwrap();
assert_eq!(forwarded.client_ip(), Some(IpAddr::from([12, 23, 34, 45])));
assert!(forwarded.client_proto().is_none());
// ...
Ok::<_, Infallible>(())
}));
let req = Request::builder()
.header("X-Forwarded-For", "12.23.34.45")
.body(())
.unwrap();
service.serve(Context::default(), req).await.unwrap();
}
Implementations§
§impl<T> GetForwardedHeaderLayer<T>
impl<T> GetForwardedHeaderLayer<T>
pub const fn new() -> GetForwardedHeaderLayer<T>
pub const fn new() -> GetForwardedHeaderLayer<T>
Create a new GetForwardedHeaderLayer
for the specified headers T
.
§impl GetForwardedHeaderLayer
impl GetForwardedHeaderLayer
pub fn forwarded() -> GetForwardedHeaderLayer
pub fn forwarded() -> GetForwardedHeaderLayer
Create a new GetForwardedHeaderLayer
for the standard Forwarded
header.
§impl GetForwardedHeaderLayer<Via>
impl GetForwardedHeaderLayer<Via>
pub fn via() -> GetForwardedHeaderLayer<Via>
pub fn via() -> GetForwardedHeaderLayer<Via>
Create a new GetForwardedHeaderLayer
for the canonical Via
header.
§impl GetForwardedHeaderLayer<XForwardedFor>
impl GetForwardedHeaderLayer<XForwardedFor>
pub fn x_forwarded_for() -> GetForwardedHeaderLayer<XForwardedFor>
pub fn x_forwarded_for() -> GetForwardedHeaderLayer<XForwardedFor>
Create a new GetForwardedHeaderLayer
for the canonical [X-Forwarded-For
] header.
§impl GetForwardedHeaderLayer<XForwardedHost>
impl GetForwardedHeaderLayer<XForwardedHost>
pub fn x_forwarded_host() -> GetForwardedHeaderLayer<XForwardedHost>
pub fn x_forwarded_host() -> GetForwardedHeaderLayer<XForwardedHost>
Create a new GetForwardedHeaderLayer
for the canonical [X-Forwarded-Host
] header.
§impl GetForwardedHeaderLayer<XForwardedProto>
impl GetForwardedHeaderLayer<XForwardedProto>
pub fn x_forwarded_proto() -> GetForwardedHeaderLayer<XForwardedProto>
pub fn x_forwarded_proto() -> GetForwardedHeaderLayer<XForwardedProto>
Create a new GetForwardedHeaderLayer
for the canonical [X-Forwarded-Proto
] header.
Trait Implementations§
§impl<T> Clone for GetForwardedHeaderLayer<T>where
T: Clone,
impl<T> Clone for GetForwardedHeaderLayer<T>where
T: Clone,
§fn clone(&self) -> GetForwardedHeaderLayer<T>
fn clone(&self) -> GetForwardedHeaderLayer<T>
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read more§impl<T> Debug for GetForwardedHeaderLayer<T>where
T: Debug,
impl<T> Debug for GetForwardedHeaderLayer<T>where
T: Debug,
§impl Default for GetForwardedHeaderLayer
impl Default for GetForwardedHeaderLayer
§fn default() -> GetForwardedHeaderLayer
fn default() -> GetForwardedHeaderLayer
§impl<H, S> Layer<S> for GetForwardedHeaderLayer<H>
impl<H, S> Layer<S> for GetForwardedHeaderLayer<H>
§type Service = GetForwardedHeaderService<S, H>
type Service = GetForwardedHeaderService<S, H>
§fn layer(&self, inner: S) -> <GetForwardedHeaderLayer<H> as Layer<S>>::Service
fn layer(&self, inner: S) -> <GetForwardedHeaderLayer<H> as Layer<S>>::Service
§fn into_layer(self, inner: S) -> Self::Service
fn into_layer(self, inner: S) -> Self::Service
layer
but consuming self after the service was created. Read moreAuto Trait Implementations§
impl<T> Freeze for GetForwardedHeaderLayer<T>
impl<T> RefUnwindSafe for GetForwardedHeaderLayer<T>
impl<T> Send for GetForwardedHeaderLayer<T>
impl<T> Sync for GetForwardedHeaderLayer<T>
impl<T> Unpin for GetForwardedHeaderLayer<T>
impl<T> UnwindSafe for GetForwardedHeaderLayer<T>
Blanket Implementations§
§impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
§impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
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
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§impl<T> FutureExt for T
impl<T> FutureExt for T
§fn with_context(self, otel_cx: Context) -> WithContext<Self> ⓘ
fn with_context(self, otel_cx: Context) -> WithContext<Self> ⓘ
§fn with_current_context(self) -> WithContext<Self> ⓘ
fn with_current_context(self) -> WithContext<Self> ⓘ
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
§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§impl<T> Pointable for T
impl<T> Pointable for T
§impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> PolicyExt for Twhere
T: ?Sized,
§fn and<P, B, E>(self, other: P) -> And<T, P>
fn and<P, B, E>(self, other: P) -> And<T, P>
Policy
that returns Action::Follow
only if self
and other
return
Action::Follow
. Read more