Refactor.

This commit is contained in:
Moriyoshi Koizumi 2021-07-14 18:52:28 +09:00
commit 6825c6da12
2 changed files with 12 additions and 3 deletions

View file

@ -7,16 +7,19 @@ use std::str::FromStr;
use warp::filters::addr::remote;
use warp::Filter;
#[derive(Clone)]
/// Represents a set of IP networks.
#[derive(Debug, Clone)]
pub struct IpNetworks {
networks: Vec<IpNetwork>,
}
impl IpNetworks {
/// Checks if addr is part of any IP networks included.
pub fn contains(&self, addr: &IpAddr) -> bool {
self.networks.iter().any(|&network| network.contains(*addr))
}
/// Special constructor that builds IpNetwork from an iterator of IP addresses.
pub fn from_ipaddr_iter<'a, T: Iterator<Item = &'a IpAddr>>(addrs: T) -> Self {
Self::from_iter(addrs.map(|&addr| -> IpNetwork {
match addr {
@ -27,6 +30,12 @@ impl IpNetworks {
}
}
impl From<&Vec<IpAddr>> for IpNetworks {
fn from(addrs: &Vec<IpAddr>) -> Self {
Self::from_ipaddr_iter(addrs.iter())
}
}
impl FromIterator<IpNetwork> for IpNetworks {
fn from_iter<T: IntoIterator<Item = IpNetwork>>(addrs: T) -> Self {
IpNetworks {

View file

@ -1,10 +1,10 @@
use std::net::IpAddr;
use warp::Filter;
use warp_real_ip::{IpNetworks, real_ip};
use warp_real_ip::real_ip;
fn serve<'a>(trusted: Vec<IpAddr>) -> impl Filter<Extract = (String,)> + 'a {
warp::any()
.and(real_ip(IpNetworks::from_ipaddr_iter(trusted.iter())))
.and(real_ip((&trusted).into()))
.map(|addr: Option<IpAddr>| addr.unwrap().to_string())
}