Type changes, performance improvements

This commit is contained in:
Ara Sadoyan
2025-11-27 18:03:34 +01:00
parent 8ba8d32df1
commit c68a4ad83d
2 changed files with 19 additions and 63 deletions

View File

@@ -56,11 +56,11 @@ impl GetHost for LB {
let client_entry = self.client_headers.get(peer)?; let client_entry = self.client_headers.get(peer)?;
let server_entry = self.server_headers.get(peer)?; let server_entry = self.server_headers.get(peer)?;
let mut current_path = path; let mut current_path = path;
let mut best_match = None; let mut clnt_match = None;
loop { loop {
if let Some(entry) = client_entry.get(current_path) { if let Some(entry) = client_entry.get(current_path) {
if !entry.value().is_empty() { if !entry.value().is_empty() {
best_match = Some(entry.value().clone()); clnt_match = Some(entry.value().clone());
break; break;
} }
} }
@@ -84,19 +84,18 @@ impl GetHost for LB {
} else { } else {
break; break;
} }
if best_match.is_none() { if serv_match.is_none() {
if let Some(entry) = server_entry.get("/") { if let Some(entry) = server_entry.get("/") {
if !entry.value().is_empty() { if !entry.value().is_empty() {
best_match = Some(entry.value().clone()); serv_match = Some(entry.value().clone());
break; break;
} }
} }
} }
} }
let result = GetHostsReturHeaders { Some(GetHostsReturHeaders {
client_headers: best_match, client_headers: clnt_match,
server_headers: serv_match, server_headers: serv_match,
}; })
Some(result)
} }
} }

View File

@@ -39,6 +39,7 @@ pub struct Context {
hostname: Option<String>, hostname: Option<String>,
upstream_peer: Option<InnerMap>, upstream_peer: Option<InnerMap>,
extraparams: arc_swap::Guard<Arc<Extraparams>>, extraparams: arc_swap::Guard<Arc<Extraparams>>,
client_headers: Arc<Vec<(Arc<str>, Arc<str>)>>,
} }
#[async_trait] #[async_trait]
@@ -53,6 +54,7 @@ impl ProxyHttp for LB {
hostname: None, hostname: None,
upstream_peer: None, upstream_peer: None,
extraparams: self.extraparams.load(), extraparams: self.extraparams.load(),
client_headers: Arc::new(Vec::new()),
} }
} }
async fn request_filter(&self, session: &mut Session, _ctx: &mut Self::CTX) -> Result<bool> { async fn request_filter(&self, session: &mut Session, _ctx: &mut Self::CTX) -> Result<bool> {
@@ -117,7 +119,6 @@ impl ProxyHttp for LB {
Ok(false) Ok(false)
} }
async fn upstream_peer(&self, session: &mut Session, ctx: &mut Self::CTX) -> Result<Box<HttpPeer>> { async fn upstream_peer(&self, session: &mut Session, ctx: &mut Self::CTX) -> Result<Box<HttpPeer>> {
// let host_name = return_header_host(&session);
match ctx.hostname.as_ref() { match ctx.hostname.as_ref() {
Some(hostname) => { Some(hostname) => {
match ctx.upstream_peer.as_ref() { match ctx.upstream_peer.as_ref() {
@@ -190,24 +191,21 @@ impl ProxyHttp for LB {
} }
if let Some(headers) = self.get_header(ctx.hostname.as_ref().unwrap_or(&"localhost".to_string()), session.req_header().uri.path()) { if let Some(headers) = self.get_header(ctx.hostname.as_ref().unwrap_or(&"localhost".to_string()), session.req_header().uri.path()) {
if let Some(client_headers) = headers.server_headers { if let Some(server_headers) = headers.server_headers {
for k in client_headers { for k in server_headers {
upstream_request.insert_header(k.0, k.1)?; upstream_request.insert_header(k.0, k.1)?;
} }
} }
if let Some(client_headers) = headers.client_headers {
let converted: Vec<(Arc<str>, Arc<str>)> = client_headers.into_iter().map(|(k, v)| (Arc::<str>::from(k), Arc::<str>::from(v))).collect();
ctx.client_headers = Arc::new(converted);
}
} }
Ok(()) Ok(())
} }
// async fn request_body_filter(&self, _session: &mut Session, _body: &mut Option<Bytes>, _end_of_stream: bool, _ctx: &mut Self::CTX) -> Result<()>
// where
// Self::CTX: Send + Sync,
// {
// Ok(())
// }
async fn response_filter(&self, session: &mut Session, _upstream_response: &mut ResponseHeader, ctx: &mut Self::CTX) -> Result<()> { async fn response_filter(&self, session: &mut Session, _upstream_response: &mut ResponseHeader, ctx: &mut Self::CTX) -> Result<()> {
// _upstream_response.insert_header("X-Proxied-From", "Fooooooooooooooo").unwrap();
if ctx.extraparams.sticky_sessions { if ctx.extraparams.sticky_sessions {
let backend_id = ctx.backend_id.clone(); let backend_id = ctx.backend_id.clone();
if let Some(bid) = self.ump_byid.get(&backend_id) { if let Some(bid) = self.ump_byid.get(&backend_id) {
@@ -220,52 +218,11 @@ impl ProxyHttp for LB {
redirect_response.insert_header("Content-Length", "0")?; redirect_response.insert_header("Content-Length", "0")?;
session.write_response_header(Box::new(redirect_response), false).await?; session.write_response_header(Box::new(redirect_response), false).await?;
} }
match ctx.hostname.as_ref() {
Some(host) => {
let path = session.req_header().uri.path();
let split_header = host.split_once(':');
match split_header {
Some((host, _port)) => {
if let Some(headers) = self.get_header(host, path) {
if let Some(server_headers) = headers.client_headers {
for k in server_headers {
_upstream_response.insert_header(k.0, k.1).unwrap();
}
}
}
}
None => {
if let Some(headers) = self.get_header(host, path) {
if let Some(server_headers) = headers.client_headers {
for k in server_headers {
_upstream_response.insert_header(k.0, k.1).unwrap();
}
}
}
}
}
// match split_header { for (key, value) in ctx.client_headers.iter() {
// Some(sh) => { _upstream_response.insert_header(key.to_string(), value.as_ref()).unwrap();
// let client_header = self.get_header(sh.0, path);
// for k in client_header.iter() {
// for t in k.iter() {
// _upstream_response.insert_header(t.0.clone(), t.1.clone()).unwrap();
// }
// }
// }
// None => {
// let client_header = self.get_header(host_header, path);
// for k in client_header.iter() {
// for t in k.iter() {
// _upstream_response.insert_header(t.0.clone(), t.1.clone()).unwrap();
// }
// }
// }
// }
}
None => {}
} }
session.set_keepalive(Some(300)); session.set_keepalive(Some(300));
Ok(()) Ok(())
} }