diff options
author | teutat3s <10206665+teutat3s@users.noreply.github.com> | 2023-03-13 13:59:42 +0100 |
---|---|---|
committer | teutat3s <10206665+teutat3s@users.noreply.github.com> | 2023-03-13 13:59:42 +0100 |
commit | 8ad6efb338bd20036614dd0697edb328aed1e7fd (patch) | |
tree | bef0b3bb43be503b5459e610f782e658562cf3bf /src/util/forwarded_headers.rs | |
parent | 3b498c7c4725ab83edd5fdeba65b32ae6bdc3e66 (diff) | |
parent | 3325928c1327eb35201723013388ede2399f2350 (diff) | |
download | garage-8ad6efb338bd20036614dd0697edb328aed1e7fd.tar.gz garage-8ad6efb338bd20036614dd0697edb328aed1e7fd.zip |
Merge branch 'main' into pnet_datalink-0.33.0
Diffstat (limited to 'src/util/forwarded_headers.rs')
-rw-r--r-- | src/util/forwarded_headers.rs | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/src/util/forwarded_headers.rs b/src/util/forwarded_headers.rs new file mode 100644 index 00000000..6ae275aa --- /dev/null +++ b/src/util/forwarded_headers.rs @@ -0,0 +1,63 @@ +use http::{HeaderMap, HeaderValue}; +use std::net::IpAddr; +use std::str::FromStr; + +use crate::error::{Error, OkOrMessage}; + +pub fn handle_forwarded_for_headers(headers: &HeaderMap<HeaderValue>) -> Result<String, Error> { + let forwarded_for_header = headers + .get("x-forwarded-for") + .ok_or_message("X-Forwarded-For header not provided")?; + + let forwarded_for_ip_str = forwarded_for_header + .to_str() + .ok_or_message("Error parsing X-Forwarded-For header")?; + + let client_ip = IpAddr::from_str(&forwarded_for_ip_str) + .ok_or_message("Valid IP address not found in X-Forwarded-For header")?; + + Ok(client_ip.to_string()) +} + +#[cfg(test)] +mod test { + use super::*; + + #[test] + fn test_handle_forwarded_for_headers_ipv4_client() { + let mut test_headers = HeaderMap::new(); + test_headers.insert("X-Forwarded-For", "192.0.2.100".parse().unwrap()); + + if let Ok(forwarded_ip) = handle_forwarded_for_headers(&test_headers) { + assert_eq!(forwarded_ip, "192.0.2.100"); + } + } + + #[test] + fn test_handle_forwarded_for_headers_ipv6_client() { + let mut test_headers = HeaderMap::new(); + test_headers.insert("X-Forwarded-For", "2001:db8::f00d:cafe".parse().unwrap()); + + if let Ok(forwarded_ip) = handle_forwarded_for_headers(&test_headers) { + assert_eq!(forwarded_ip, "2001:db8::f00d:cafe"); + } + } + + #[test] + fn test_handle_forwarded_for_headers_invalid_ip() { + let mut test_headers = HeaderMap::new(); + test_headers.insert("X-Forwarded-For", "www.example.com".parse().unwrap()); + + let result = handle_forwarded_for_headers(&test_headers); + assert!(result.is_err()); + } + + #[test] + fn test_handle_forwarded_for_headers_missing() { + let mut test_headers = HeaderMap::new(); + test_headers.insert("Host", "www.deuxfleurs.fr".parse().unwrap()); + + let result = handle_forwarded_for_headers(&test_headers); + assert!(result.is_err()); + } +} |