From b898c53ae1253bc840dd29e3da4d0c476818b0b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20Frosteg=C3=A5rd?= Date: Sun, 14 Apr 2024 00:46:02 +0200 Subject: [PATCH 1/2] http: don't require peer addr to have been set in send_response --- crates/http/src/workers/socket/connection.rs | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/crates/http/src/workers/socket/connection.rs b/crates/http/src/workers/socket/connection.rs index a8cd846..eb45538 100644 --- a/crates/http/src/workers/socket/connection.rs +++ b/crates/http/src/workers/socket/connection.rs @@ -441,14 +441,20 @@ where Response::Failure(_) => "error", }; - let peer_addr = self + // If we're behind a reverse proxy and we're sending an error + // response due to failing to parse a request, opt_peer_addr might + // not yet be set (and in that case, we don't know if the true peer + // connects over IPv4 or IPv6) + let ip_version_str = self .opt_peer_addr - .expect("peer addr should already have been extracted by now"); + .as_ref() + .map(peer_addr_to_ip_version_str) + .unwrap_or("?"); ::metrics::counter!( "aquatic_responses_total", "type" => response_type, - "ip_version" => peer_addr_to_ip_version_str(&peer_addr), + "ip_version" => ip_version_str, "worker_index" => self.worker_index_string.clone(), ) .increment(1); From 3e7ad2a9e7de21581326979df76d972ca17ef533 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20Frosteg=C3=A5rd?= Date: Sun, 14 Apr 2024 00:47:57 +0200 Subject: [PATCH 2/2] http socket worker, connection module: add comment about peer addr --- crates/http/src/workers/socket/connection.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/crates/http/src/workers/socket/connection.rs b/crates/http/src/workers/socket/connection.rs index eb45538..c2d4089 100644 --- a/crates/http/src/workers/socket/connection.rs +++ b/crates/http/src/workers/socket/connection.rs @@ -146,6 +146,8 @@ struct Connection { request_senders: Rc>, valid_until: Rc>, server_start_instant: ServerStartInstant, + // If we're running behind a reverse proxy, gets set as soon as we get a + // valid requiest. Otherwise, must be set before calling `run`. opt_peer_addr: Option, peer_port: u16, request_buffer: Box<[u8; REQUEST_BUFFER_SIZE]>,