|
|
|
@ -19,11 +19,21 @@ impl KeyExtractor for ForwardedPeerIpKeyExtractor {
|
|
|
|
|
|
|
|
|
|
fn extract(&self, req: &ServiceRequest) -> Result<Self::Key, Self::KeyExtractionError> {
|
|
|
|
|
let forwarded_for = req.headers().get("x-forwarded-for");
|
|
|
|
|
if self.proxied && forwarded_for.is_some() {
|
|
|
|
|
read_forwareded_for(forwarded_for).map_err(SimpleKeyExtractionError::new)
|
|
|
|
|
let mut ip = if self.proxied && forwarded_for.is_some() {
|
|
|
|
|
read_forwareded_for(forwarded_for).map_err(SimpleKeyExtractionError::new)?
|
|
|
|
|
} else {
|
|
|
|
|
PeerIpKeyExtractor.extract(req)
|
|
|
|
|
PeerIpKeyExtractor.extract(req)?
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// only keep the first /56 for ipv6 addresses
|
|
|
|
|
// mask 0xffff_ffff_ffff_ff00_0000_0000_0000_0000
|
|
|
|
|
if let IpAddr::V6(ipv6) = ip {
|
|
|
|
|
let mut octets = ipv6.octets();
|
|
|
|
|
octets[7..16].fill(0);
|
|
|
|
|
ip = IpAddr::V6(octets.into());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Ok(ip)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn exceed_rate_limit_response(
|
|
|
|
|