Skip to main content

rama_http_headers/forwarded/
mod.rs

1use rama_net::forwarded::ForwardedElement;
2
3mod via;
4#[doc(inline)]
5pub use via::Via;
6
7mod std;
8#[doc(inline)]
9pub use std::Forwarded;
10
11mod x_forwarded_for;
12#[doc(inline)]
13pub use x_forwarded_for::XForwardedFor;
14
15mod x_forwarded_host;
16#[doc(inline)]
17pub use x_forwarded_host::XForwardedHost;
18
19mod x_forwarded_proto;
20#[doc(inline)]
21pub use x_forwarded_proto::XForwardedProto;
22
23mod exotic_forward_ip;
24#[doc(inline)]
25pub use exotic_forward_ip::{CFConnectingIp, ClientIp, TrueClientIp, XClientIp, XRealIp};
26
27/// A trait for types headers that is used by middleware
28/// which supports headers that can be converted into and from Forward data.
29pub trait ForwardHeader:
30    crate::HeaderEncode + crate::HeaderDecode + IntoIterator<Item = ForwardedElement>
31{
32    /// Try to convert the given iterator of `ForwardedElement` into the header.
33    ///
34    /// `None` is returned if the conversion fails.
35    fn try_from_forwarded<'a, I>(into_it: I) -> Option<Self>
36    where
37        I: IntoIterator<Item = &'a ForwardedElement>,
38        Self: Sized;
39}
40
41#[cfg(test)]
42mod tests {
43    use super::*;
44
45    fn assert_forward_header<T: ForwardHeader>() {}
46
47    #[test]
48    fn test_forward_header_impls() {
49        assert_forward_header::<Forwarded>();
50        assert_forward_header::<Via>();
51        assert_forward_header::<XForwardedFor>();
52        assert_forward_header::<XForwardedHost>();
53        assert_forward_header::<XForwardedProto>();
54        assert_forward_header::<CFConnectingIp>();
55        assert_forward_header::<TrueClientIp>();
56        assert_forward_header::<XClientIp>();
57        assert_forward_header::<ClientIp>();
58        assert_forward_header::<XRealIp>();
59    }
60}