From 4aa18ec02483e22e9656c2e5f2c3132d3c0ce8ce Mon Sep 17 00:00:00 2001 From: Sachymetsu Date: Fri, 25 Sep 2026 20:40:22 +0200 Subject: [PATCH] Refactor IdentifiedPeer extraction and format --- Cargo.lock | 91 ++++++------- crates/nailcancel/src/tree_node.rs | 6 +- crates/nailfv/Cargo.toml | 20 --- crates/nailip/Cargo.toml | 5 +- .../lib.rs => nailip/src/forwarded_for.rs} | 27 ++-- crates/nailip/src/lib.rs | 46 ++++--- crates/nailip/src/maybe_header.rs | 27 ++-- crates/nailip/src/peer_addr.rs | 127 ++++++++++++++++++ crates/nailrater/Cargo.toml | 1 - crates/nailrater/src/futures.rs | 2 +- crates/nailrater/src/lib.rs | 4 +- crates/nailtrace/src/lib.rs | 9 +- 12 files changed, 238 insertions(+), 127 deletions(-) delete mode 100644 crates/nailfv/Cargo.toml rename crates/{nailfv/src/lib.rs => nailip/src/forwarded_for.rs} (74%) create mode 100644 crates/nailip/src/peer_addr.rs diff --git a/Cargo.lock b/Cargo.lock index f4d9741..7f7a869 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -144,9 +144,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.4.7" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54413ede23c2daf518f35156dfde027feb2374004d63bd497f983c8db9c0e313" +checksum = "207aedd8d29a0eb804986bc99eed0d43719fec84a9b7f9c8b70cf83b97cffcc1" dependencies = [ "find-msvc-tools", "jobserver", @@ -253,9 +253,9 @@ dependencies = [ [[package]] name = "config" -version = "0.15.25" +version = "0.15.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b85f248a4de22d204ceabc6299d89d2c70fbd7f09fea53c06c852369652d8139" +checksum = "790374c727a4cb20877dd2cc99ce7011cbe03b0b8df083acccd37df0d161304d" dependencies = [ "pathdiff", "serde_core", @@ -444,9 +444,9 @@ checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223" [[package]] name = "find-msvc-tools" -version = "0.1.13" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef25905e51abafe4dcea6c15fec58c57b601cdbd0ee53d22ea1d3016c587d39b" +checksum = "aedcfb3409746eddb02b9e19ebda1c3394f759a152e48ee875a0844d1b955484" [[package]] name = "fixedbitset" @@ -754,15 +754,16 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.20" +version = "0.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" +checksum = "ddc03d96684f9226b8a787cdb71488417b53ab5ea8fdb1dac946cb9431cc8bff" dependencies = [ "bytes", "futures-channel", "futures-util", "http", "http-body", + "httparse", "hyper", "libc", "pin-project-lite", @@ -833,9 +834,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.105" +version = "0.3.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce57d20d1ea864ce2ac172ab472d409214f4fd359f0b2a2775abdf522e2af99e" +checksum = "7883d941dae510fb2d978fc3fe018c71c9e2892fd38854de3e8b92c2e5ad9cc5" dependencies = [ "cfg-if", "futures-util", @@ -978,14 +979,6 @@ dependencies = [ "serde", ] -[[package]] -name = "nailfv" -version = "0.1.0" -dependencies = [ - "color-eyre", - "winnow", -] - [[package]] name = "nailgen" version = "0.1.0" @@ -1000,7 +993,7 @@ dependencies = [ "nailkov", "nailrng", "pin-project-lite", - "rand 0.10.2", + "rand 0.10.3", "tokio", "tracing", "tracing-futures", @@ -1011,9 +1004,10 @@ dependencies = [ name = "nailip" version = "0.1.0" dependencies = [ + "color-eyre", "hyper", "nailbody", - "nailfv", + "winnow", ] [[package]] @@ -1027,7 +1021,7 @@ dependencies = [ "indexmap", "itertools 0.15.0", "nailrng", - "rand 0.10.2", + "rand 0.10.3", "rand_distr", "rapidhash", "tracing", @@ -1097,7 +1091,6 @@ dependencies = [ "nailbody", "nailbox", "nailconfig", - "nailfv", "nailip", "nailspicy", "parking_lot", @@ -1207,7 +1200,7 @@ dependencies = [ "nailkov", "nailrng", "nailspicy", - "rand 0.10.2", + "rand 0.10.3", ] [[package]] @@ -1605,9 +1598,9 @@ dependencies = [ [[package]] name = "rand" -version = "0.10.2" +version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7f5fa3a058cd35567ef9bfa5e75732bee0f9e4c55fa90477bef2dfcdbc4be80" +checksum = "65c9fb96cbc91e3478eaae79a69fcd3f1ae4ad052e471fe6732fff548984b4af" dependencies = [ "chacha20", "getrandom 0.4.3", @@ -1646,7 +1639,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4d431c2703ccf129de4d45253c03f49ebb22b97d6ad79ee3ecfc7e3f4862c1d8" dependencies = [ "num-traits", - "rand 0.10.2", + "rand 0.10.3", ] [[package]] @@ -1737,9 +1730,9 @@ checksum = "4cfa9e87e97427c3a1b472eace073b2bc577ad0e1444c128d938b3d5bcdacb17" [[package]] name = "saa" -version = "5.6.1" +version = "5.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08ae9d01b806e889f90d47e13c18fb95edd95a2222b42eee5e671679bc3476d7" +checksum = "bd85992a680de788217d9c70b74aa7685b108cf1aba02f728fb27f1b27199ad1" [[package]] name = "same-file" @@ -1850,9 +1843,9 @@ checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" [[package]] name = "smallvec" -version = "1.16.1" +version = "1.16.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba467056f1b547ed52077911161fc86985becbc60e8e1857c8a144dab0def891" +checksum = "f9395f0f0eee849a9b707b2f06bb92a6a422090e2123bb2ef8e87a0e61892a8e" [[package]] name = "socket2" @@ -1903,18 +1896,18 @@ checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" [[package]] name = "thiserror" -version = "2.0.20" +version = "2.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec86235f5fcc2a73650310756d2ac5b138a5780bbbdfae3eeccec992c435ba4f" +checksum = "09e52cb86a36cede5cb101bf8908837b3e4c6e5e59fe7fd85c23fb56200d189e" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "2.0.20" +version = "2.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc04cd3e1236dd4a98afca4569f2deb3f120e5422a4023be2cb683f8486292af" +checksum = "fe5197923287db20a58125f0bc85c062f7f2c892de97b18c356f9efb14b28524" dependencies = [ "proc-macro2", "quote", @@ -2219,7 +2212,7 @@ checksum = "2ef6dac1e96601b4fb3acccccff2139741fcb757cb9a36089bf5be91cfb285ce" dependencies = [ "getrandom 0.4.3", "js-sys", - "rand 0.10.2", + "rand 0.10.3", "wasm-bindgen", ] @@ -2265,9 +2258,9 @@ dependencies = [ [[package]] name = "wasm-bindgen" -version = "0.2.128" +version = "0.2.129" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aecb87a33d3b0c5e3b7aa46336eaf486cffafbd281b195e4c8b80d50df2351bf" +checksum = "9bb54f33acc68fd454578d9820b0bde1a1a3d17aa17bb7b6595806d02886d409" dependencies = [ "cfg-if", "once_cell", @@ -2278,9 +2271,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.128" +version = "0.2.129" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a690d511e3c1a8b3a55e33511e3c2c00c78415cd23650f32b808627f5696b9ed" +checksum = "2e29d0c35b16e224a7eeb5cd2d25e3e1968fbd65604117b44d3b789d00ee8535" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -2288,9 +2281,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.128" +version = "0.2.129" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "411e4887f0071ef2d2164a9d5fdf2d20efbef78fccd3a78b0c10a1dc5295e48a" +checksum = "6f501a8bc3719dba86ef8ae4728879c08001bea749eb1333ac5b91e040e2a6b7" dependencies = [ "bumpalo", "proc-macro2", @@ -2301,18 +2294,18 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.128" +version = "0.2.129" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81941cd78d0c92026c33e5e01312845a4cb1e9af3407f9134b100dd03144103e" +checksum = "23f0c9c52aa7cd7d77769a4cfe2a9adb1b331f489a41d912ce14513d5ab995c6" dependencies = [ "unicode-ident", ] [[package]] name = "web-sys" -version = "0.3.105" +version = "0.3.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fbddc4a036f00ec4f18c83445bd3115cb306a91da554919a099d9222fe4a7f8" +checksum = "88261b9deccee56594c11a3460c462c41f58d148598fe70ad77070126a68aba4" dependencies = [ "js-sys", "wasm-bindgen", @@ -2400,18 +2393,18 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.8.57" +version = "0.8.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d35102a9f36d089ccae9e4c6802bc118be4487b80aaffc0ab4e0cf5ce92d2873" +checksum = "c17e8fafad82b542ff3717217ecdc736231b59e387768c9630123b4ce4d2db44" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.57" +version = "0.8.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "146c01f5ab44258da43cf276c74a2763db2ff3969c9c652c3f2de07041d0b2bc" +checksum = "595f56e044df4f46a0c9a626f65c3d99eb8488f7e8a8baa12dd76326d9710bf2" dependencies = [ "proc-macro2", "quote", diff --git a/crates/nailcancel/src/tree_node.rs b/crates/nailcancel/src/tree_node.rs index 0dda425..eccf67a 100644 --- a/crates/nailcancel/src/tree_node.rs +++ b/crates/nailcancel/src/tree_node.rs @@ -57,7 +57,7 @@ impl TreeNode { inner: Mutex::new(Inner { parent: None, parent_idx: 0, - children: vec![], + children: Vec::new(), is_cancelled: false, num_handles: 1, }), @@ -86,7 +86,7 @@ impl TreeNode { inner: Mutex::new(Inner { parent: None, parent_idx: 0, - children: vec![], + children: Vec::new(), is_cancelled: true, num_handles: 1, }), @@ -98,7 +98,7 @@ impl TreeNode { inner: Mutex::new(Inner { parent: Some(self.clone()), parent_idx: locked_parent.children.len(), - children: vec![], + children: Vec::new(), is_cancelled: false, num_handles: 1, }), diff --git a/crates/nailfv/Cargo.toml b/crates/nailfv/Cargo.toml deleted file mode 100644 index 5bbe740..0000000 --- a/crates/nailfv/Cargo.toml +++ /dev/null @@ -1,20 +0,0 @@ -[package] -name = "nailfv" -authors.workspace = true -edition.workspace = true -repository.workspace = true -version.workspace = true -license.workspace = true -rust-version.workspace = true - -[lints] -workspace = true - -[dependencies] -winnow.workspace = true - -[dev-dependencies] -color-eyre.workspace = true - -[lib] -bench = false diff --git a/crates/nailip/Cargo.toml b/crates/nailip/Cargo.toml index 39bcb8c..1f7f72f 100644 --- a/crates/nailip/Cargo.toml +++ b/crates/nailip/Cargo.toml @@ -8,9 +8,12 @@ license.workspace = true rust-version.workspace = true [dependencies] -nailfv = { path = "../nailfv" } nailbody = { path = "../nailbody" } hyper.workspace = true +winnow.workspace = true + +[dev-dependencies] +color-eyre.workspace = true [lints] workspace = true diff --git a/crates/nailfv/src/lib.rs b/crates/nailip/src/forwarded_for.rs similarity index 74% rename from crates/nailfv/src/lib.rs rename to crates/nailip/src/forwarded_for.rs index 804fca4..1d803ed 100644 --- a/crates/nailfv/src/lib.rs +++ b/crates/nailip/src/forwarded_for.rs @@ -22,28 +22,21 @@ fn match_for<'s>(prefix: &mut &'s str) -> ModalResult<&'s str> { /// `"[::1]:8080"`. IPv6 addresses in the Forwarded header are always wrapped in `"`, /// with the address component wrapped in square brackets. The port component `:8080` /// may or may not be present in the identifier. -fn extract_ipv6(identifier: &mut &str) -> ModalResult> { +fn extract_ipv6<'s>(identifier: &mut &'s str) -> ModalResult<&'s str> { literal('"').parse_next(identifier)?; - take_until(0.., '"').map(Into::into).parse_next(identifier) -} - -/// Extracts the IPv4 address from the identifier string. Expects the format -/// `192.168.0.1:8080`. IPv4 addresses are not wrapped with `"` in contrast to IPv6 -/// addresses. The port component `:8080` may or may not be present in the identifier. -fn extract_ipv4(identifier: &mut &str) -> ModalResult> { - rest.map(Into::into).parse_next(identifier) + take_until(1.., '"').parse_next(identifier) } /// Extracts the identifier from the Forwarded for value. Attempts to parse the identifier part /// as either an IPv6 address or IPv4 address. The Forwarded for format supports more identifier /// types, but we discard those as they are useless to us. -fn extract_identifier(identifier: &mut &str) -> ModalResult> { - alt((extract_ipv6, extract_ipv4)).parse_next(identifier) +fn extract_identifier<'s>(identifier: &mut &'s str) -> ModalResult<&'s str> { + alt((extract_ipv6, rest)).parse_next(identifier) } /// Extracts the identifier from the Forwarded for value. First it checks for the correct /// prefix `for=`, then attempts to extract the identifier. -pub fn extract_for(header_part: &mut &str) -> ModalResult> { +pub fn extract_for<'s>(header_part: &mut &'s str) -> ModalResult<&'s str> { space0(header_part)?; match_for(header_part)?; @@ -65,35 +58,35 @@ mod tests { extract_for .parse("for=1.2.3.4") .map_err(|a| color_eyre::eyre::eyre!("Identifier parsing error:\n{a}"))?, - Box::from("1.2.3.4") + "1.2.3.4" ); assert_eq!( extract_for .parse("fOr=1.2.3.4:1234") .map_err(|a| color_eyre::eyre::eyre!("Identifier parsing error:\n{a}"))?, - Box::from("1.2.3.4:1234") + "1.2.3.4:1234" ); assert_eq!( extract_for .parse(" fOR=1.2.3.4:1234") .map_err(|a| color_eyre::eyre::eyre!("Identifier parsing error:\n{a}"))?, - Box::from("1.2.3.4:1234") + "1.2.3.4:1234" ); assert_eq!( extract_for .parse("FOr=\"[::1]:1234\"") .map_err(|a| color_eyre::eyre::eyre!("Identifier parsing error:\n{a}"))?, - Box::from("[::1]:1234") + "[::1]:1234" ); assert_eq!( extract_for .parse("FOR=\"[::1]\"") .map_err(|a| color_eyre::eyre::eyre!("Identifier parsing error:\n{a}"))?, - Box::from("[::1]") + "[::1]" ); Ok(()) diff --git a/crates/nailip/src/lib.rs b/crates/nailip/src/lib.rs index 8aaad9c..f1b23d9 100644 --- a/crates/nailip/src/lib.rs +++ b/crates/nailip/src/lib.rs @@ -1,36 +1,50 @@ -use core::net::SocketAddr; +use core::net::{IpAddr, SocketAddr}; use hyper::{HeaderMap, Request, Response, body::Incoming, service::Service}; use nailbody::Body; pub use crate::maybe_header::*; +mod forwarded_for; mod maybe_header; +mod peer_addr; -#[derive(Debug, Clone, Hash, PartialEq, Eq, PartialOrd, Ord)] -#[repr(transparent)] -pub struct IdentifiedPeer(Box); +#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq, PartialOrd, Ord)] +#[repr(align(4))] +pub struct IdentifiedPeer { + pub peer: IpAddr, + pub port: Option, +} impl IdentifiedPeer { #[inline] pub fn extract(headers: &HeaderMap, connection: &SocketAddr) -> Self { - Self( - maybe_x_forwarded_for(headers) - .or_else(|| maybe_x_real_ip(headers)) - .or_else(|| maybe_forwarded_for(headers)) - .unwrap_or_else(|| connection.to_string().into()), - ) - } - - #[inline] - pub fn peer(&self) -> &str { - &self.0 + maybe_x_forwarded_for(headers) + .or_else(|| maybe_x_real_ip(headers)) + .or_else(|| maybe_forwarded_for(headers)) + .unwrap_or_else(|| IdentifiedPeer { + peer: connection.ip(), + port: Some(connection.port()), + }) } } impl core::fmt::Display for IdentifiedPeer { fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { - write!(f, "{}", self.0) + match &self.peer { + IpAddr::V4(ipv4_addr) => { + write!(f, "{ipv4_addr}")?; + } + IpAddr::V6(ipv6_addr) => { + write!(f, "[{ipv6_addr}]")?; + } + }; + + if let Some(port) = self.port { + write!(f, ":{port}")?; + } + + Ok(()) } } diff --git a/crates/nailip/src/maybe_header.rs b/crates/nailip/src/maybe_header.rs index fa13966..6ac13b4 100644 --- a/crates/nailip/src/maybe_header.rs +++ b/crates/nailip/src/maybe_header.rs @@ -2,44 +2,51 @@ use hyper::{ HeaderMap, header::{FORWARDED, HeaderValue}, }; -use nailfv::{Parser, extract_for}; +use winnow::Parser; + +use crate::{IdentifiedPeer, forwarded_for::extract_for, peer_addr::get_peer_addr}; const X_REAL_IP: &str = "x-real-ip"; const X_FORWARDED_FOR: &str = "x-forwarded-for"; /// Tries to parse the `x-forwarded-for` header #[inline] -pub fn maybe_x_forwarded_for(headers: &HeaderMap) -> Option> { +pub fn maybe_x_forwarded_for(headers: &HeaderMap) -> Option { headers .get(X_FORWARDED_FOR) .and_then(header_value_to_str) .and_then(|header| { header .split(',') - .map(str::trim) - .find_map(|header_parts| (!header_parts.is_empty()).then(|| header_parts.into())) + .find_map(|header_parts| get_peer_addr(&mut header_parts.trim()).ok()) + .map(|(peer, port)| IdentifiedPeer { peer, port }) }) } /// Tries to parse the `x-real-ip` header #[inline] -pub fn maybe_x_real_ip(headers: &HeaderMap) -> Option> { +pub fn maybe_x_real_ip(headers: &HeaderMap) -> Option { headers .get(X_REAL_IP) .and_then(header_value_to_str) - .map(|header| header.trim().into()) + .and_then(|header| get_peer_addr(&mut header.trim()).ok()) + .map(|(peer, port)| IdentifiedPeer { peer, port }) } /// Tries to parse `forwarded` headers #[inline] -pub fn maybe_forwarded_for(headers: &HeaderMap) -> Option> { +pub fn maybe_forwarded_for(headers: &HeaderMap) -> Option { headers.get_all(FORWARDED).iter().find_map(|header| { header_value_to_str(header).and_then(|header| { header .split(&[',', ';']) - .map(str::trim) - .filter(|&header_parts| !header_parts.is_empty()) - .find_map(|header_parts| extract_for.parse(header_parts).ok()) + .find_map(|header_parts| { + extract_for + .and_then(get_peer_addr) + .parse_next(&mut header_parts.trim()) + .ok() + }) + .map(|(peer, port)| IdentifiedPeer { peer, port }) }) }) } diff --git a/crates/nailip/src/peer_addr.rs b/crates/nailip/src/peer_addr.rs new file mode 100644 index 0000000..691acee --- /dev/null +++ b/crates/nailip/src/peer_addr.rs @@ -0,0 +1,127 @@ +use std::net::IpAddr; + +use winnow::{ + ModalResult, Parser, + ascii::digit1, + combinator::{alt, opt}, + error::ErrMode, + token::{literal, rest, take_until}, +}; + +/// Extracts the port number from a string beginning with `:` followed by digits. +fn get_port(peer: &mut &str) -> ModalResult { + literal(":").parse_next(peer)?; + digit1.parse_to().parse_next(peer) +} + +pub fn get_peer_addr_v4(peer: &mut &str) -> ModalResult<(IpAddr, Option)> { + match take_until(0.., ':').parse_to().parse_next(peer) { + Ok(ip) => { + let port = opt(get_port).parse_next(peer)?; + + Ok((IpAddr::V4(ip), port)) + } + Err(ErrMode::Backtrack(_)) => { + let ip = rest.parse_to().parse_next(peer)?; + + Ok((IpAddr::V4(ip), None)) + } + Err(e) => Err(e), + } +} + +pub fn get_peer_addr_v6(peer: &mut &str) -> ModalResult<(IpAddr, Option)> { + match literal('[').parse_next(peer) { + Ok(_) => { + let ip = take_until(1.., ']').parse_to().parse_next(peer)?; + + literal(']').parse_next(peer)?; + + let port = opt(get_port).parse_next(peer)?; + + Ok((IpAddr::V6(ip), port)) + } + Err(ErrMode::Backtrack(_)) => { + let ip = rest.parse_to().parse_next(peer)?; + + Ok((IpAddr::V6(ip), None)) + } + Err(e) => Err(e), + } +} + +#[inline] +pub fn get_peer_addr(peer: &mut &str) -> ModalResult<(IpAddr, Option)> { + alt((get_peer_addr_v6, get_peer_addr_v4)).parse_next(peer) +} + +#[cfg(test)] +mod tests { + use std::net::{Ipv4Addr, Ipv6Addr}; + + use super::*; + + #[test] + fn get_addr_v6() { + let target_addr = IpAddr::V6(Ipv6Addr::LOCALHOST); + + let mut addr = "[::1]"; + + let parsed = get_peer_addr(&mut addr); + + assert_eq!(parsed, Ok((target_addr, None))); + + let mut addr = "[::1]:123"; + + let parsed = get_peer_addr(&mut addr); + + assert_eq!(parsed, Ok((target_addr, Some(123)))); + + let mut addr = "[::1]:80000"; + + let parsed = get_peer_addr(&mut addr); + + assert_eq!(parsed, Ok((target_addr, None))); + + let mut addr = "[::1]:aaaa"; + + let parsed = get_peer_addr(&mut addr); + + assert_eq!(parsed, Ok((target_addr, None))); + + let mut addr = "::1"; + + let parsed = get_peer_addr(&mut addr); + + assert_eq!(parsed, Ok((target_addr, None))); + } + + #[test] + fn get_addr_v4() { + let target_addr = IpAddr::V4(Ipv4Addr::LOCALHOST); + + let mut addr = "127.0.0.1"; + + let parsed = get_peer_addr(&mut addr); + + assert_eq!(parsed, Ok((target_addr, None))); + + let mut addr = "127.0.0.1:123"; + + let parsed = get_peer_addr(&mut addr); + + assert_eq!(parsed, Ok((target_addr, Some(123)))); + + let mut addr = "127.0.0.1:99999"; + + let parsed = get_peer_addr(&mut addr); + + assert_eq!(parsed, Ok((target_addr, None))); + + let mut addr = "127.0.0.1:bobobo"; + + let parsed = get_peer_addr(&mut addr); + + assert_eq!(parsed, Ok((target_addr, None))); + } +} diff --git a/crates/nailrater/Cargo.toml b/crates/nailrater/Cargo.toml index 2177f63..6989466 100644 --- a/crates/nailrater/Cargo.toml +++ b/crates/nailrater/Cargo.toml @@ -11,7 +11,6 @@ rust-version.workspace = true detailed_traces = [] [dependencies] -nailfv = { path = "../nailfv" } nailconfig = { path = "../nailconfig" } nailspicy = { path = "../nailspicy" } nailip = { path = "../nailip" } diff --git a/crates/nailrater/src/futures.rs b/crates/nailrater/src/futures.rs index f92f734..4e2c4ed 100644 --- a/crates/nailrater/src/futures.rs +++ b/crates/nailrater/src/futures.rs @@ -119,7 +119,7 @@ impl NailedResponseFuture { ) -> Self { Self { state: NailedState::RatePeer { - peer: peer.clone(), + peer, entry: boxed_future_within(|| PEERS.entry_async(peer)), req: Some(req), mode, diff --git a/crates/nailrater/src/lib.rs b/crates/nailrater/src/lib.rs index 260c2b8..069b9e2 100644 --- a/crates/nailrater/src/lib.rs +++ b/crates/nailrater/src/lib.rs @@ -74,14 +74,14 @@ where type Future = Instrumented>; fn call(&self, req: Request) -> Self::Future { - let Some(proxied) = req.extensions().get::() else { + let Some(proxied) = req.extensions().get::().copied() else { return NailedResponseFuture::error().instrument(tracing::info_span!("error response")); }; let cloned = self.inner.clone(); NailedResponseFuture::rate_peer( - proxied.clone(), + proxied, self.spicy_payload.clone(), self.mode.clone(), req, diff --git a/crates/nailtrace/src/lib.rs b/crates/nailtrace/src/lib.rs index 6f2d03b..2899665 100644 --- a/crates/nailtrace/src/lib.rs +++ b/crates/nailtrace/src/lib.rs @@ -130,14 +130,13 @@ where let http_method = req.method().as_str(); let identified = req.extensions().get::().unwrap(); - let mut peer = identified.peer().split(":"); let span = info_span!( "HTTP request", http.request.method = %http_method, http.route = Empty, // to set by router of "webframework" after network.protocol.version = %utils::http_flavor(req.version()), - client.address = Empty, + client.address = %identified.peer, client.port = Empty, user_agent.original = headers .get(USER_AGENT) @@ -161,11 +160,7 @@ where error.type = Empty, ); - if let Some(address) = peer.next() { - span.record("client.address", address); - } - - if let Some(port) = peer.next() { + if let Some(port) = identified.port { span.record("client.port", port); } -- 2.51.2