diff --git a/Cargo.lock b/Cargo.lock index aefe94b..97ce8a5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -138,7 +138,7 @@ checksum = "2a4385e2e34eb35d6b3efe798b9eb88096925d87726c0798709bf56d9ed84af3" [[package]] name = "aralez" -version = "0.93.1" +version = "0.93.2" dependencies = [ "ahash", "arc-swap", diff --git a/Cargo.toml b/Cargo.toml index e6f46fd..70c5ac3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "aralez" -version = "0.93.1" +version = "0.93.2" edition = "2021" license = "Apache-2.0" description = "Reverse proxy built on top of Cloudflare's Pingora" diff --git a/etc/consul/apache.hcl b/etc/consul/apache.hcl index 6351ca6..85311c4 100644 --- a/etc/consul/apache.hcl +++ b/etc/consul/apache.hcl @@ -44,7 +44,8 @@ job "apache" { tags = [ "aralez.service=yes", "aralez.host=apache.blablabla.com", - "aralez.path=/" + "aralez.path=/", + "aralez.redirect=http://checkip.amazonaws.com" ] check { type = "http" @@ -54,9 +55,7 @@ job "apache" { timeout = "2s" } } - driver = "docker" - config { image = "httpd:latest" force_pull = true diff --git a/etc/consul/echo.hcl b/etc/consul/echo.hcl index d2c486c..e90f1d4 100644 --- a/etc/consul/echo.hcl +++ b/etc/consul/echo.hcl @@ -45,11 +45,11 @@ job "echo" { "aralez.service=yes", "aralez.host=echo.blablabla.com", "aralez.path=/", - "aralez.rate=100", - "aralez.4xx_rate=50", - "aralez.to_https=false", - "aralez.client_headers=WyJYLUVjaG8tU2VuZDpIb29vb29vb29vb29vIiwiWC1FY2hvLVJlY3Y6WW9vb29vb29vb29vbyJdCg==", - "aralez.server_headers=WyJYLVByb3h5LUZyb206IEFyYWxleiIsIlgtQmFyaS1MdXlzOiBBcGVyIEphbiIsIlgtQW5rYXAtSGVhZGVyOiBCZXNhbXAgQW5rYXAgSGVhZGVyIl0K" + "aralez.rate=20", + "aralez.4xx_rate=10", + "aralez.to_https=true", + "aralez.client_header=X-Client-Header:Some simple header", + "aralez.server_header=X-Server-Header:Some simple header", ] check { type = "http" @@ -59,9 +59,7 @@ job "echo" { timeout = "2s" } } - driver = "docker" - config { image = "ealen/echo-server:latest" force_pull = true diff --git a/etc/consul/nginx.hcl b/etc/consul/nginx.hcl index 1f57769..fb77d81 100644 --- a/etc/consul/nginx.hcl +++ b/etc/consul/nginx.hcl @@ -45,12 +45,13 @@ job "nginx" { "aralez.service=yes", "aralez.host=nginx.blablabla.com", "aralez.path=/", - "aralez.rate=20", + "aralez.rate=1", "aralez.4xx_rate=10", "aralez.to_https=true", - "aralez.auth=basic root:toor", - "aralez.client_headers=WwogICAgIlgtU29tZS1IZWFkZXI6QUFBQUFBQUFBQUFBQUFBIiwKICAgICJYLUVtb3MtSGVhZGVyOlpaWlpaWlpaWlpaWlpaWiIsCiAgICAiWC1PdGhlci1oZWFkZXI6VmF5VmF5VmF5IiwKICAgICJYLVJlaHRvLWhlYWRlcjpaYXlaYXlaYXkiCl0KCg==", - "aralez.server_headers=WyJYLVByb3h5LUZyb206IEFyYWxleiIsIlgtQmFyaS1MdXlzOiBBcGVyIEphbiIsIlgtQW5rYXAtSGVhZGVyOiBCZXNhbXAgQW5rYXAgSGVhZGVyIl0K" + "aralez.client_header=X-Some:Some Random Header", + "aralez.client_header=X-Emos:Redaeh Modnar Emos", + "aralez.server_header=X-From:Aralez & Consul", + "aralez.server_header=X-Mrof: Lusnoc & Zelara", ] check { type = "http" @@ -60,9 +61,7 @@ job "nginx" { timeout = "2s" } } - driver = "docker" - config { image = "nginx:latest" force_pull = true diff --git a/src/utils/httpclient.rs b/src/utils/httpclient.rs index f09214c..e9c017e 100644 --- a/src/utils/httpclient.rs +++ b/src/utils/httpclient.rs @@ -3,9 +3,7 @@ use crate::utils::kuberconsul::match_path; use crate::utils::kubernetes::KubeEndpoints; use crate::utils::structs::{GlobalServiceMapping, InnerMap}; use ahash::HashMap; -use base64::{engine::general_purpose, Engine as _}; use dashmap::DashMap; -use log::warn; use pingora_core::connectors::http::Connector; use pingora_core::listeners::ALPN; use pingora_core::prelude::HttpPeer; @@ -66,28 +64,8 @@ fn parse_services(json: Vec) -> Result { "aralez.to_https" => internal.to_https = value.parse::().ok(), "aralez.auth" => internal.auth = Option::from(value.to_string()), "aralez.redirect" => internal.redirect = Option::from(value.to_string()), - "aralez.client_headers" => { - let decoded_bytes = general_purpose::STANDARD.decode(value).unwrap_or_default(); - let decoded: Result, serde_json::Error> = serde_json::from_slice(&decoded_bytes); - match decoded { - Ok(dd) => internal.client_headers = Some(dd), - Err(er) => { - warn!("Could not decode client headers: {}", er); - internal.client_headers = None - } - } - } - "aralez.server_headers" => { - let decoded_bytes = general_purpose::STANDARD.decode(value).unwrap_or_default(); - let decoded: Result, serde_json::Error> = serde_json::from_slice(&decoded_bytes); - match decoded { - Ok(dd) => internal.server_headers = Some(dd), - Err(er) => { - warn!("Could not decode server headers: {}", er); - internal.server_headers = None - } - } - } + "aralez.client_header" => internal.client_headers.get_or_insert_default().push(value.to_string()), + "aralez.server_header" => internal.server_headers.get_or_insert_default().push(value.to_string()), _ => {} } } diff --git a/src/web/proxyhttp.rs b/src/web/proxyhttp.rs index 935ec1e..c7e0453 100644 --- a/src/web/proxyhttp.rs +++ b/src/web/proxyhttp.rs @@ -310,15 +310,16 @@ impl ProxyHttp for LB { let _ = _upstream_response.append_header("set-cookie", buf.as_str()); } } - + Ok(()) + } + async fn upstream_response_filter(&self, _session: &mut Session, upstream_response: &mut ResponseHeader, ctx: &mut Self::CTX) -> Result<()> { if let Some(client_headers) = &ctx.client_headers { for (k, v) in client_headers.iter() { - _upstream_response.append_header(k.clone(), v.as_ref())?; + upstream_response.append_header(k.clone(), v.as_ref())?; } } Ok(()) } - async fn logging(&self, session: &mut Session, _e: Option<&pingora::Error>, ctx: &mut Self::CTX) { let response_code = session.response_written().map_or(0, |resp| resp.status.as_u16()); let m = &MetricTypes {