Skip to main content

rama/cli/service/
mod.rs

1//! Reusable CLI [`Service`]s.
2//!
3//! These services are used by rama's binary
4//! distribution and that can be added to your own rama-driven CLI application as well.
5//!
6//! [`Service`]: crate::Service
7
8pub mod echo;
9pub mod fs;
10pub mod geo;
11pub mod http_security;
12pub mod ip;
13
14use crate::{
15    cli::ForwardKind,
16    combinators::Either7,
17    http::{
18        headers::forwarded::{
19            CFConnectingIp, ClientIp, TrueClientIp, XClientIp, XForwardedFor, XRealIp,
20        },
21        layer::forwarded::GetForwardedHeaderLayer,
22    },
23};
24
25/// The forwarded-header extraction layer selected by a [`ForwardKind`].
26///
27/// `None` means no extraction: the default, and `HaProxy` (which forwards at
28/// the transport layer instead).
29type HttpForwardedLayer = Option<
30    Either7<
31        GetForwardedHeaderLayer,
32        GetForwardedHeaderLayer<XForwardedFor>,
33        GetForwardedHeaderLayer<XClientIp>,
34        GetForwardedHeaderLayer<ClientIp>,
35        GetForwardedHeaderLayer<XRealIp>,
36        GetForwardedHeaderLayer<CFConnectingIp>,
37        GetForwardedHeaderLayer<TrueClientIp>,
38    >,
39>;
40
41/// Build the HTTP forwarded-header extraction layer selected by `forward`,
42/// shared by the echo and fs CLI services.
43pub(super) fn http_forwarded_layer(forward: Option<&ForwardKind>) -> HttpForwardedLayer {
44    match forward {
45        None | Some(ForwardKind::HaProxy) => None,
46        Some(ForwardKind::Forwarded) => Some(Either7::A(GetForwardedHeaderLayer::forwarded())),
47        Some(ForwardKind::XForwardedFor) => {
48            Some(Either7::B(GetForwardedHeaderLayer::x_forwarded_for()))
49        }
50        Some(ForwardKind::XClientIp) => {
51            Some(Either7::C(GetForwardedHeaderLayer::<XClientIp>::new()))
52        }
53        Some(ForwardKind::ClientIp) => Some(Either7::D(GetForwardedHeaderLayer::<ClientIp>::new())),
54        Some(ForwardKind::XRealIp) => Some(Either7::E(GetForwardedHeaderLayer::<XRealIp>::new())),
55        Some(ForwardKind::CFConnectingIp) => {
56            Some(Either7::F(GetForwardedHeaderLayer::<CFConnectingIp>::new()))
57        }
58        Some(ForwardKind::TrueClientIp) => {
59            Some(Either7::G(GetForwardedHeaderLayer::<TrueClientIp>::new()))
60        }
61    }
62}