rama_http/headers/forwarded/
mod.rs

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