fmt
Some checks failed
CI / checks (push) Failing after 2s

This commit is contained in:
Robin Appelman 2024-11-29 20:08:15 +01:00
commit e60f654544
2 changed files with 20 additions and 18 deletions

View file

@ -1,7 +1,7 @@
use comma_separated::CommaSeparatedIterator; use comma_separated::CommaSeparatedIterator;
use rfc7239::{parse, Forwarded, NodeIdentifier, NodeName}; use rfc7239::{parse, Forwarded, NodeIdentifier, NodeName};
use std::borrow::Cow; use std::borrow::Cow;
use std::iter::{ IntoIterator}; use std::iter::IntoIterator;
use std::net::IpAddr; use std::net::IpAddr;
use std::str::FromStr; use std::str::FromStr;
@ -19,16 +19,18 @@ use std::str::FromStr;
/// ``` /// ```
/// ///
/// Note: if you need the other data provided by the `forwarded` header, have a look at the [`rfc7239`](https://docs.rs/rfc7239) crate. /// Note: if you need the other data provided by the `forwarded` header, have a look at the [`rfc7239`](https://docs.rs/rfc7239) crate.
pub fn extract_forwarded_header(header_value: &str) -> impl DoubleEndedIterator<Item = IpAddr> + '_ { pub fn extract_forwarded_header(
header_value: &str,
) -> impl DoubleEndedIterator<Item = IpAddr> + '_ {
parse(header_value).filter_map(|forward| match forward { parse(header_value).filter_map(|forward| match forward {
Ok(Forwarded { Ok(Forwarded {
forwarded_for: forwarded_for:
Some(NodeIdentifier { Some(NodeIdentifier {
name: NodeName::Ip(ip), name: NodeName::Ip(ip),
.. ..
}), }),
.. ..
}) => Some(ip), }) => Some(ip),
_ => None, _ => None,
}) })
} }
@ -45,7 +47,9 @@ pub fn extract_forwarded_header(header_value: &str) -> impl DoubleEndedIterator<
/// extract_x_forwarded_for_header("10.10.10.10,10.10.10.20").collect::<Vec<_>>() /// extract_x_forwarded_for_header("10.10.10.10,10.10.10.20").collect::<Vec<_>>()
/// ); /// );
/// ``` /// ```
pub fn extract_x_forwarded_for_header(header_value: &str) -> impl DoubleEndedIterator<Item = IpAddr> + '_ { pub fn extract_x_forwarded_for_header(
header_value: &str,
) -> impl DoubleEndedIterator<Item = IpAddr> + '_ {
CommaSeparatedIterator::new(header_value) CommaSeparatedIterator::new(header_value)
.map(str::trim) .map(str::trim)
.flat_map(|x| IpAddr::from_str(maybe_bracketed(&maybe_quoted(x)))) .flat_map(|x| IpAddr::from_str(maybe_bracketed(&maybe_quoted(x))))

View file

@ -55,21 +55,19 @@
pub mod headers; pub mod headers;
use crate::headers::{
extract_forwarded_header, extract_real_ip_header, extract_x_forwarded_for_header,
};
use http::HeaderMap; use http::HeaderMap;
pub use ipnet::IpNet;
use itertools::Either; use itertools::Either;
use std::iter::{empty, once}; use std::iter::{empty, once};
use std::net::IpAddr; use std::net::IpAddr;
use crate::headers::{extract_forwarded_header, extract_real_ip_header, extract_x_forwarded_for_header};
pub use ipnet::IpNet;
/// Get the "real-ip" of an incoming request. /// Get the "real-ip" of an incoming request.
/// ///
/// See the [top level documentation](crate) for more usage details. /// See the [top level documentation](crate) for more usage details.
pub fn real_ip( pub fn real_ip(headers: &HeaderMap, remote: IpAddr, trusted_proxies: &[IpNet]) -> Option<IpAddr> {
headers: &HeaderMap,
remote: IpAddr,
trusted_proxies: &[IpNet],
) -> Option<IpAddr> {
let mut hops = get_forwarded_for(headers).chain(once(remote)); let mut hops = get_forwarded_for(headers).chain(once(remote));
let first = hops.next(); let first = hops.next();
let hops = first.iter().copied().chain(hops); let hops = first.iter().copied().chain(hops);