From 451e1f469e9358ae90b996acedd7a9374afc4a28 Mon Sep 17 00:00:00 2001 From: Ara Sadoyan Date: Tue, 25 Mar 2025 19:19:54 +0100 Subject: [PATCH] Add global headers for all upstreams --- etc/upstreams.yaml | 25 ++++++++++--------------- src/utils/parceyaml.rs | 13 ++++++++++++- src/web/proxyhttp.rs | 18 ++++++++++-------- 3 files changed, 32 insertions(+), 24 deletions(-) diff --git a/etc/upstreams.yaml b/etc/upstreams.yaml index f4595d8..ede8161 100644 --- a/etc/upstreams.yaml +++ b/etc/upstreams.yaml @@ -1,12 +1,17 @@ +provider: "file" +globals: + headers: + - "Access-Control-Allow-Origin:*" + - "Access-Control-Allow-Methods:POST, GET, OPTIONS" + - "Access-Control-Max-Age:86400" upstreams: myip.netangels.net: paths: "/": ssl: false headers: - - "Access-Control-Allow-Origin:*" - - "Access-Control-Allow-Methods:POST, GET, OPTIONS" - - "Access-Control-Max-Age:86400" + - "X-Some-Thing:Yaaaaaaaaaaaaaaa" + - "X-Prox-From:Hopaaaaaaaaaaaar" servers: - "127.0.0.1:8000" - "127.0.0.2:8000" @@ -48,8 +53,7 @@ upstreams: "/": ssl: false headers: - - "X-Some-Thing:Yaaaaaaaaaaaaaaa" - - "X-Prox-From:Hopaaaaaaaaaaaar" + - "X-Hopar-From:Hopaaaaaaaaaaaar" servers: - "192.168.1.10:8000" - "192.168.1.10:8000" @@ -70,13 +74,4 @@ upstreams: - "X-Some-Thing:Yaaaaaaaaaaaaaaa" - "X-Prox-From:Hopaaaaaaaaaaaar" servers: - - "192.168.1.5:8080" -# 127.0.0.1: -# paths: -# "/camerastatus": -# ssl: false -# headers: -# - "X-Some-Thing:Yaaaaaaaaaaaaaaa" -# - "X-Prox-From:Hopaaaaaaaaaaaar" -# servers: -# - "192.168.1.5:8080" \ No newline at end of file + - "192.168.1.5:8080" \ No newline at end of file diff --git a/src/utils/parceyaml.rs b/src/utils/parceyaml.rs index df55e12..99311c3 100644 --- a/src/utils/parceyaml.rs +++ b/src/utils/parceyaml.rs @@ -10,6 +10,7 @@ use std::sync::atomic::AtomicUsize; #[derive(Debug, Serialize, Deserialize)] struct Config { upstreams: HashMap, + globals: HashMap>, } #[derive(Debug, Serialize, Deserialize)] @@ -57,13 +58,23 @@ pub fn load_yaml_to_dashmap(d: &str, kind: &str) -> Option<(UpstreamsDashMap, He for (path, path_config) in host_config.paths { let mut server_list = Vec::new(); let mut hl = Vec::new(); + + // Set global headers + for headers in parsed.globals.get("headers").iter().by_ref() { + for header in headers.iter() { + if let Some((key, val)) = header.split_once(':') { + hl.push((key.to_string(), val.to_string())); + } + } + } + // Set per host/path headers for header in path_config.headers.iter().by_ref() { if let Some((key, val)) = header.split_once(':') { hl.push((key.to_string(), val.to_string())); } } + header_list.insert(path.clone(), hl); - // println!(" {:?} == {:?}", hostname, header_list); for server in path_config.servers { if let Some((ip, port_str)) = server.split_once(':') { if let Ok(port) = port_str.parse::() { diff --git a/src/web/proxyhttp.rs b/src/web/proxyhttp.rs index dbb22de..b394b8c 100644 --- a/src/web/proxyhttp.rs +++ b/src/web/proxyhttp.rs @@ -68,15 +68,16 @@ impl BackgroundService for LB { val = rx.next() => { match val { Some(ss) => { - let foo = compare_dashmaps(&*self.ump_full, &ss.0); - if !foo { - clone_dashmap_into(&ss.0, &self.ump_full); - clone_dashmap_into(&ss.0, &self.ump_upst); - for (k,v) in ss.1 { - self.headers.insert(k,v); - } - print_upstreams(&self.ump_full); + // let foo = compare_dashmaps(&*self.ump_full, &ss.0); + // println!("{:?}", ss.1); + // if !foo { + clone_dashmap_into(&ss.0, &self.ump_full); + clone_dashmap_into(&ss.0, &self.ump_upst); + for (k,v) in ss.1 { + self.headers.insert(k,v); } + print_upstreams(&self.ump_full); + // } } None => {} } @@ -265,5 +266,6 @@ impl ProxyHttp for LB { 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()); debug!("{}, response code: {response_code}", self.request_summary(session, ctx)); + info!("{}, response code: {response_code}", self.request_summary(session, ctx)); } }