fix(cache): wire trusted-proxy cache and remove stale cache traces (#2581)

This commit is contained in:
houseme
2026-04-18 00:57:21 +08:00
committed by GitHub
parent 38eb0781cf
commit ffcf18f5f3
13 changed files with 231 additions and 51 deletions
@@ -13,7 +13,9 @@
// limitations under the License.
use axum::http::HeaderMap;
use rustfs_trusted_proxies::{ClientInfo, ProxyChainAnalyzer, ProxyValidator, TrustedProxy, TrustedProxyConfig, ValidationMode};
use rustfs_trusted_proxies::{
CacheConfig, ClientInfo, ProxyChainAnalyzer, ProxyValidator, TrustedProxy, TrustedProxyConfig, ValidationMode,
};
use std::net::{IpAddr, SocketAddr};
use std::str::FromStr;
@@ -77,3 +79,56 @@ fn test_proxy_chain_too_long() {
_ => panic!("Expected ChainTooLong error"),
}
}
#[test]
fn test_validator_caches_trusted_direct_peer_decision() {
let validator = ProxyValidator::with_cache_config(create_test_config(), CacheConfig::default(), None);
let peer_addr = Some(SocketAddr::new(IpAddr::from_str("192.168.1.100").unwrap(), 8080));
let headers = HeaderMap::new();
assert_eq!(validator.cache_stats().size, 0);
let first = validator.validate_request(peer_addr, &headers).unwrap();
assert!(first.is_from_trusted_proxy);
assert_eq!(validator.cache_stats().size, 1);
let second = validator.validate_request(peer_addr, &headers).unwrap();
assert!(second.is_from_trusted_proxy);
assert_eq!(validator.cache_stats().size, 1);
}
#[test]
fn test_validator_caches_untrusted_direct_peer_decision() {
let validator = ProxyValidator::with_cache_config(create_test_config(), CacheConfig::default(), None);
let peer_addr = Some(SocketAddr::new(IpAddr::from_str("203.0.113.8").unwrap(), 8080));
let headers = HeaderMap::new();
let first = validator.validate_request(peer_addr, &headers).unwrap();
assert!(!first.is_from_trusted_proxy);
assert_eq!(validator.cache_stats().size, 0);
let second = validator.validate_request(peer_addr, &headers).unwrap();
assert!(!second.is_from_trusted_proxy);
assert_eq!(validator.cache_stats().size, 0);
}
#[test]
fn test_validator_skips_cache_when_peer_addr_is_missing() {
let validator = ProxyValidator::with_cache_config(create_test_config(), CacheConfig::default(), None);
let headers = HeaderMap::new();
let client_info = validator.validate_request(None, &headers).unwrap();
assert!(!client_info.is_from_trusted_proxy);
assert_eq!(validator.cache_stats().size, 0);
}
#[test]
fn test_validator_skips_cache_for_unspecified_peer_addr() {
let validator = ProxyValidator::with_cache_config(create_test_config(), CacheConfig::default(), None);
let peer_addr = Some(SocketAddr::new(IpAddr::from([0, 0, 0, 0]), 0));
let headers = HeaderMap::new();
let client_info = validator.validate_request(peer_addr, &headers).unwrap();
assert!(!client_info.is_from_trusted_proxy);
assert_eq!(validator.cache_stats().size, 0);
}