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: crate::Header + IntoIterator<Item = ForwardedElement> {
30    /// Try to convert the given iterator of `ForwardedElement` into the header.
31    ///
32    /// `None` is returned if the conversion fails.
33    fn try_from_forwarded<'a, I>(into_it: I) -> Option<Self>
34    where
35        I: IntoIterator<Item = &'a ForwardedElement>,
36        Self: Sized;
37}
38
39#[cfg(test)]
40mod tests {
41    use super::*;
42
43    fn assert_forward_header<T: ForwardHeader>() {}
44
45    #[test]
46    fn test_forward_header_impls() {
47        assert_forward_header::<Forwarded>();
48        assert_forward_header::<Via>();
49        assert_forward_header::<XForwardedFor>();
50        assert_forward_header::<XForwardedHost>();
51        assert_forward_header::<XForwardedProto>();
52        assert_forward_header::<CFConnectingIp>();
53        assert_forward_header::<TrueClientIp>();
54        assert_forward_header::<XClientIp>();
55        assert_forward_header::<ClientIp>();
56        assert_forward_header::<XRealIp>();
57    }
58}