fix(rustproxy-routing): reduce hot-path allocations in routing, metrics, and proxy protocol handling
This commit is contained in:
@@ -399,11 +399,19 @@ impl HttpProxyService {
|
||||
let path = req.uri().path().to_string();
|
||||
let method = req.method().clone();
|
||||
|
||||
// Extract headers for matching
|
||||
let headers: HashMap<String, String> = req.headers()
|
||||
.iter()
|
||||
.map(|(k, v)| (k.to_string(), v.to_str().unwrap_or("").to_string()))
|
||||
.collect();
|
||||
// Extract headers for matching — only allocate the HashMap if any route
|
||||
// on this port actually uses header matching. Most deployments don't,
|
||||
// so this saves ~20-30 String allocations per request.
|
||||
let current_rm = self.route_manager.load();
|
||||
let needs_headers = current_rm.any_route_has_headers(port);
|
||||
let headers: Option<HashMap<String, String>> = if needs_headers {
|
||||
Some(req.headers()
|
||||
.iter()
|
||||
.map(|(k, v)| (k.to_string(), v.to_str().unwrap_or("").to_string()))
|
||||
.collect())
|
||||
} else {
|
||||
None
|
||||
};
|
||||
|
||||
debug!("HTTP {} {} (host: {:?}) from {}", method, path, host, peer_addr);
|
||||
|
||||
@@ -414,19 +422,19 @@ impl HttpProxyService {
|
||||
}
|
||||
}
|
||||
|
||||
// Match route
|
||||
// Match route (current_rm already loaded above for headers check)
|
||||
let ip_string = peer_addr.ip().to_string();
|
||||
let ctx = rustproxy_routing::MatchContext {
|
||||
port,
|
||||
domain: host.as_deref(),
|
||||
path: Some(&path),
|
||||
client_ip: Some(&peer_addr.ip().to_string()),
|
||||
client_ip: Some(&ip_string),
|
||||
tls_version: None,
|
||||
headers: Some(&headers),
|
||||
headers: headers.as_ref(),
|
||||
is_tls: false,
|
||||
protocol: Some("http"),
|
||||
};
|
||||
|
||||
let current_rm = self.route_manager.load();
|
||||
let route_match = match current_rm.find_route(&ctx) {
|
||||
Some(rm) => rm,
|
||||
None => {
|
||||
@@ -436,7 +444,7 @@ impl HttpProxyService {
|
||||
};
|
||||
|
||||
let route_id = route_match.route.id.as_deref();
|
||||
let ip_str = peer_addr.ip().to_string();
|
||||
let ip_str = ip_string; // reuse from above (avoid redundant to_string())
|
||||
self.metrics.record_http_request();
|
||||
|
||||
// Apply request filters (IP check, rate limiting, auth)
|
||||
|
||||
Reference in New Issue
Block a user