use std::collections::HashMap;
use std::net::IpAddr;
use common::prelude::*;
pub type Headers = HashMap<String, String>;
pub fn parse_forwarded_for(headers: &Headers) -> Result<Vec<IpAddr>> {
let mut result = vec![];
if let Some(header) = headers.get("X-Forwarded-For".into()) {
let splitted: Vec<&str> = header.split(',').collect();
for address in &splitted {
result.push(address.trim().parse::<IpAddr>()?);
}
}
Ok(result)
}
#[cfg(test)]
mod tests {
use std::net::IpAddr;
use super::{parse_forwarded_for, Headers};
#[test]
fn test_parse_forwarded_for() {
assert_eq!(
parse_forwarded_for(&Headers::new()).unwrap(),
Vec::<IpAddr>::new()
);
let mut headers = Headers::new();
headers.insert("X-Forwarded-For".into(), "127.0.0.1".into());
assert_eq!(
parse_forwarded_for(&headers).unwrap(),
vec!["127.0.0.1".parse::<IpAddr>().unwrap()]
);
let mut headers = Headers::new();
headers.insert("X-Forwarded-For".into(), "127.0.0.1, 10.0.0.1".into());
assert_eq!(
parse_forwarded_for(&headers).unwrap(),
vec![
"127.0.0.1".parse::<IpAddr>().unwrap(),
"10.0.0.1".parse::<IpAddr>().unwrap(),
]
);
let mut headers = Headers::new();
headers.insert("X-Forwarded-For".into(), "127.0.0.1, hey, 10.0.0.1".into());
assert!(parse_forwarded_for(&headers).is_err());
}
}