Struct SetForwardedHeaderLayer
pub struct SetForwardedHeaderLayer<T = Forwarded> { /* private fields */ }
Expand description
Layer to write Forwarded
information for this proxy,
added to the end of the chain of forwarded information already known.
This layer can set any header as long as you have a ForwardHeader
implementation
for the header you want to set. You can pass it as the type to the layer when creating
the layer using SetForwardedHeaderLayer::new
.
The following headers are supported out of the box with each their own constructor:
SetForwardedHeaderLayer::forwarded
: the standardForwarded
headerRFC 7239
;SetForwardedHeaderLayer::via
: the canonicalVia
header (non-standard);SetForwardedHeaderLayer::x_forwarded_for
: the canonicalX-Forwarded-For
header (non-standard);SetForwardedHeaderLayer::x_forwarded_host
: the canonicalX-Forwarded-Host
header (non-standard);SetForwardedHeaderLayer::x_forwarded_proto
: the canonicalX-Forwarded-Proto
header (non-standard).
The “by” property is set to rama
by default. Use SetForwardedHeaderLayer::forward_by
to overwrite this,
typically with the actual IPv4
/IPv6
address of your proxy.
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 SetForwardedHeaderLayer
constructors for these headers,
but you can use the SetForwardedHeaderLayer::new
constructor and pass the header type as a type parameter,
alone or in a tuple with other headers.
§Example
This example shows how you could expose the real Client IP using the [X-Real-IP
][crate::headers::XRealIp
] header.
use rama_net::stream::SocketInfo;
use rama_http::Request;
use rama_core::service::service_fn;
use rama_http::{headers::forwarded::XRealIp, layer::forwarded::SetForwardedHeaderLayer};
use rama_core::{Context, Service, Layer};
use std::convert::Infallible;
async fn svc(_ctx: Context, request: Request<Body>) -> Result<(), Infallible> {
// ...
}
let service = SetForwardedHeaderLayer::<XRealIp>::new()
.into_layer(service_fn(svc));
service.serve(ctx, req).await.unwrap();
Implementations§
§impl<T> SetForwardedHeaderLayer<T>
impl<T> SetForwardedHeaderLayer<T>
pub fn forward_by(
self,
node_id: impl Into<NodeId>,
) -> SetForwardedHeaderLayer<T>
pub fn forward_by( self, node_id: impl Into<NodeId>, ) -> SetForwardedHeaderLayer<T>
Set the given NodeId
as the “by” property, identifying this proxy.
Default of None
will be set to rama
otherwise.
pub fn set_forward_by(
&mut self,
node_id: impl Into<NodeId>,
) -> &mut SetForwardedHeaderLayer<T>
pub fn set_forward_by( &mut self, node_id: impl Into<NodeId>, ) -> &mut SetForwardedHeaderLayer<T>
Set the given NodeId
as the “by” property, identifying this proxy.
Default of None
will be set to rama
otherwise.
§impl<T> SetForwardedHeaderLayer<T>
impl<T> SetForwardedHeaderLayer<T>
pub fn new() -> SetForwardedHeaderLayer<T>
pub fn new() -> SetForwardedHeaderLayer<T>
Create a new SetForwardedHeaderLayer
for the specified headers T
.
§impl SetForwardedHeaderLayer
impl SetForwardedHeaderLayer
pub fn forwarded() -> SetForwardedHeaderLayer
pub fn forwarded() -> SetForwardedHeaderLayer
Create a new SetForwardedHeaderLayer
for the standard Forwarded
header.
§impl SetForwardedHeaderLayer<Via>
impl SetForwardedHeaderLayer<Via>
pub fn via() -> SetForwardedHeaderLayer<Via>
pub fn via() -> SetForwardedHeaderLayer<Via>
Create a new SetForwardedHeaderLayer
for the canonical Via
header.
§impl SetForwardedHeaderLayer<XForwardedFor>
impl SetForwardedHeaderLayer<XForwardedFor>
pub fn x_forwarded_for() -> SetForwardedHeaderLayer<XForwardedFor>
pub fn x_forwarded_for() -> SetForwardedHeaderLayer<XForwardedFor>
Create a new SetForwardedHeaderLayer
for the canonical [X-Forwarded-For
] header.
§impl SetForwardedHeaderLayer<XForwardedHost>
impl SetForwardedHeaderLayer<XForwardedHost>
pub fn x_forwarded_host() -> SetForwardedHeaderLayer<XForwardedHost>
pub fn x_forwarded_host() -> SetForwardedHeaderLayer<XForwardedHost>
Create a new SetForwardedHeaderLayer
for the canonical [X-Forwarded-Host
] header.
§impl SetForwardedHeaderLayer<XForwardedProto>
impl SetForwardedHeaderLayer<XForwardedProto>
pub fn x_forwarded_proto() -> SetForwardedHeaderLayer<XForwardedProto>
pub fn x_forwarded_proto() -> SetForwardedHeaderLayer<XForwardedProto>
Create a new SetForwardedHeaderLayer
for the canonical [X-Forwarded-Proto
] header.
Trait Implementations§
§impl<T> Clone for SetForwardedHeaderLayer<T>where
T: Clone,
impl<T> Clone for SetForwardedHeaderLayer<T>where
T: Clone,
§fn clone(&self) -> SetForwardedHeaderLayer<T>
fn clone(&self) -> SetForwardedHeaderLayer<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 SetForwardedHeaderLayer<T>where
T: Debug,
impl<T> Debug for SetForwardedHeaderLayer<T>where
T: Debug,
§impl Default for SetForwardedHeaderLayer
impl Default for SetForwardedHeaderLayer
§fn default() -> SetForwardedHeaderLayer
fn default() -> SetForwardedHeaderLayer
§impl<H, S> Layer<S> for SetForwardedHeaderLayer<H>
impl<H, S> Layer<S> for SetForwardedHeaderLayer<H>
§type Service = SetForwardedHeaderService<S, H>
type Service = SetForwardedHeaderService<S, H>
§fn layer(&self, inner: S) -> <SetForwardedHeaderLayer<H> as Layer<S>>::Service
fn layer(&self, inner: S) -> <SetForwardedHeaderLayer<H> as Layer<S>>::Service
§fn into_layer(
self,
inner: S,
) -> <SetForwardedHeaderLayer<H> as Layer<S>>::Service
fn into_layer( self, inner: S, ) -> <SetForwardedHeaderLayer<H> as Layer<S>>::Service
layer
but consuming self after the service was created. Read moreAuto Trait Implementations§
impl<T> Freeze for SetForwardedHeaderLayer<T>
impl<T> RefUnwindSafe for SetForwardedHeaderLayer<T>
impl<T> Send for SetForwardedHeaderLayer<T>
impl<T> Sync for SetForwardedHeaderLayer<T>
impl<T> Unpin for SetForwardedHeaderLayer<T>
impl<T> UnwindSafe for SetForwardedHeaderLayer<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