aboutsummaryrefslogtreecommitdiff
path: root/src/modules/proxy.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/modules/proxy.rs')
-rw-r--r--src/modules/proxy.rs36
1 files changed, 32 insertions, 4 deletions
diff --git a/src/modules/proxy.rs b/src/modules/proxy.rs
index 763129f..b1af3d9 100644
--- a/src/modules/proxy.rs
+++ b/src/modules/proxy.rs
@@ -15,9 +15,16 @@ pub struct ProxyKind;
#[derive(Debug, Deserialize)]
struct Proxy {
+ set_forwarded_for: bool,
+ #[serde(default = "ret_true")]
+ set_real_ip: bool,
backend: SocketAddr,
}
+fn ret_true() -> bool {
+ true
+}
+
impl NodeKind for ProxyKind {
fn name(&self) -> &'static str {
"proxy"
@@ -33,10 +40,31 @@ impl Node for Proxy {
mut request: NodeRequest,
) -> Pin<Box<dyn Future<Output = Result<NodeResponse, ServiceError>> + Send + Sync + 'a>> {
Box::pin(async move {
- request.headers_mut().insert(
- "x-real-ip",
- HeaderValue::from_str(&format!("{}", context.addr.ip())).unwrap(),
- );
+ if self.set_real_ip {
+ request.headers_mut().insert(
+ "x-real-ip",
+ HeaderValue::from_str(&format!("{}", context.addr.ip())).unwrap(),
+ );
+ }
+ if self.set_forwarded_for {
+ request.headers_mut().insert(
+ "x-forwarded-for",
+ HeaderValue::from_str(&format!("{}", context.addr.ip())).unwrap(),
+ );
+ request.headers_mut().insert(
+ "x-forwarded-port",
+ HeaderValue::from_str(&context.addr.port().to_string()).unwrap(),
+ );
+ let scheme =
+ HeaderValue::from_str(if context.secure { "https" } else { "http" }).unwrap();
+ request
+ .headers_mut()
+ .insert("x-forwarded-scheme", scheme.clone());
+ request.headers_mut().insert("x-forwarded-proto", scheme);
+ if let Some(host) = request.headers().get("host").cloned() {
+ request.headers_mut().insert("x-forwarded-host", host);
+ }
+ }
let on_upgrade_downstream = request.extensions_mut().remove::<OnUpgrade>();