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 standardForwardedheaderRFC 7239;SetForwardedHeaderLayer::via: the canonicalViaheader (non-standard);SetForwardedHeaderLayer::x_forwarded_for: the canonicalX-Forwarded-Forheader (non-standard);SetForwardedHeaderLayer::x_forwarded_host: the canonicalX-Forwarded-Hostheader (non-standard);SetForwardedHeaderLayer::x_forwarded_proto: the canonicalX-Forwarded-Protoheader (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-IpandTrue-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::{extensions::ExtensionsMut, Service, Layer};
use std::convert::Infallible;
async fn svc(request: Request<Body>) -> Result<(), Infallible> {
// ...
}
let service = SetForwardedHeaderLayer::<XRealIp>::new()
.into_layer(service_fn(svc));
service.serve(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