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;
13pub mod wire_names;
14
15use crate::{
16    cli::ForwardKind,
17    combinators::Either7,
18    http::{
19        headers::forwarded::{
20            CFConnectingIp, ClientIp, TrueClientIp, XClientIp, XForwardedFor, XRealIp,
21        },
22        layer::forwarded::GetForwardedHeaderLayer,
23    },
24};
25
26/// The forwarded-header extraction layer selected by a [`ForwardKind`].
27///
28/// `None` means no extraction: the default, and `HaProxy` (which forwards at
29/// the transport layer instead).
30type HttpForwardedLayer = Option<
31    Either7<
32        GetForwardedHeaderLayer,
33        GetForwardedHeaderLayer<XForwardedFor>,
34        GetForwardedHeaderLayer<XClientIp>,
35        GetForwardedHeaderLayer<ClientIp>,
36        GetForwardedHeaderLayer<XRealIp>,
37        GetForwardedHeaderLayer<CFConnectingIp>,
38        GetForwardedHeaderLayer<TrueClientIp>,
39    >,
40>;
41
42/// Build the HTTP forwarded-header extraction layer selected by `forward`,
43/// shared by the echo and fs CLI services.
44pub(super) fn http_forwarded_layer(forward: Option<&ForwardKind>) -> HttpForwardedLayer {
45    match forward {
46        None | Some(ForwardKind::HaProxy) => None,
47        Some(ForwardKind::Forwarded) => Some(Either7::A(GetForwardedHeaderLayer::forwarded())),
48        Some(ForwardKind::XForwardedFor) => {
49            Some(Either7::B(GetForwardedHeaderLayer::x_forwarded_for()))
50        }
51        Some(ForwardKind::XClientIp) => {
52            Some(Either7::C(GetForwardedHeaderLayer::<XClientIp>::new()))
53        }
54        Some(ForwardKind::ClientIp) => Some(Either7::D(GetForwardedHeaderLayer::<ClientIp>::new())),
55        Some(ForwardKind::XRealIp) => Some(Either7::E(GetForwardedHeaderLayer::<XRealIp>::new())),
56        Some(ForwardKind::CFConnectingIp) => {
57            Some(Either7::F(GetForwardedHeaderLayer::<CFConnectingIp>::new()))
58        }
59        Some(ForwardKind::TrueClientIp) => {
60            Some(Either7::G(GetForwardedHeaderLayer::<TrueClientIp>::new()))
61        }
62    }
63}