Skip to content

Commit 0428972

Browse files
committed
Merge #1374: Overhaul stats events: merge HTTP core events with a different IP version
1f30f8e ci: update git hooks scripts (Jose Celano) 3969c67 refactor: [1373] include client's port in stats events when provided (Jose Celano) b8a3d44 refactor: [#1373] capture socket address from connection info in HTTP tracker (Jose Celano) 2de6c14 refactor: [#1373] merge HTTP stats events with different IP version (Jose Celano) 6de2dd9 refactor: [#1371] add connection context to HTTP core events (Jose Celano) Pull request description: Change HTTP core tracker events (`bittorrent_http_tracker_core::statistics::event::Event`) from this: ```rust pub enum Event { Tcp4Announce, Tcp4Scrape, Tcp6Announce, Tcp6Scrape, } ``` To this: ```rust pub enum Event { TcpAnnounce { connection: ConnectionContext }, TcpScrape { connection: ConnectionContext }, } pub struct ConnectionContext { client: ClientConnectionContext, server: ServerConnectionContext, } pub struct ClientConnectionContext { ip_addr: IpAddr, port: Option<u16>, } pub struct ServerConnectionContext { socket_addr: SocketAddr, } ``` ### Sub-tasks - [x] Add `ConnectionContext` to events. - [x] Merge events with the same request type (`announce` and `scrape`). - [x] Add client port to `ConnectionContext`. `ClientIpSources` type and the `packages/axum-http-tracker-server/src/v1/extractors/client_ip_sources.rs` Axum extractor have to be changed to include also the port. ACKs for top commit: josecelano: ACK 1f30f8e Tree-SHA512: a9fe256de2baf493a23ad61c2d80073e9b6c1dde578632dbed73532d19d4730f01563c1df172fbf353b9b12bf9dcea3ec1a16109fced4995c929f0daae330067
2 parents 3d3d0c7 + 1f30f8e commit 0428972

File tree

14 files changed

+379
-135
lines changed

14 files changed

+379
-135
lines changed

contrib/dev-tools/git/hooks/pre-commit.sh

+1
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,5 @@ cargo +nightly fmt --check &&
66
cargo +nightly machete &&
77
cargo +stable build &&
88
CARGO_INCREMENTAL=0 cargo +stable clippy --no-deps --tests --benches --examples --workspace --all-targets --all-features -- -D clippy::correctness -D clippy::suspicious -D clippy::complexity -D clippy::perf -D clippy::style -D clippy::pedantic &&
9+
cargo +stable test --doc --workspace &&
910
cargo +stable test --tests --benches --examples --workspace --all-targets --all-features

contrib/dev-tools/git/hooks/pre-push.sh

+1
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,6 @@ cargo +nightly fmt --check &&
66
cargo +nightly machete &&
77
cargo +stable build &&
88
CARGO_INCREMENTAL=0 cargo +stable clippy --no-deps --tests --benches --examples --workspace --all-targets --all-features -- -D clippy::correctness -D clippy::suspicious -D clippy::complexity -D clippy::perf -D clippy::style -D clippy::pedantic &&
9+
cargo +stable test --doc --workspace &&
910
cargo +stable test --tests --benches --examples --workspace --all-targets --all-features &&
1011
cargo +stable run --bin e2e_tests_runner -- --config-toml-path "./share/default/config/tracker.e2e.container.sqlite3.toml"

packages/axum-http-tracker-server/src/v1/extractors/client_ip_sources.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -63,13 +63,13 @@ where
6363
};
6464

6565
let connection_info_ip = match ConnectInfo::<SocketAddr>::from_request_parts(parts, state).await {
66-
Ok(connection_info_socket_addr) => Some(connection_info_socket_addr.0.ip()),
66+
Ok(connection_info_socket_addr) => Some(connection_info_socket_addr.0),
6767
Err(_) => None,
6868
};
6969

7070
Ok(Extract(ClientIpSources {
7171
right_most_x_forwarded_for,
72-
connection_info_ip,
72+
connection_info_socket_address: connection_info_ip,
7373
}))
7474
}
7575
}

packages/axum-http-tracker-server/src/v1/handlers/announce.rs

+42-9
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
//!
33
//! The handlers perform the authentication and authorization of the request,
44
//! and resolve the client IP address.
5+
use std::net::SocketAddr;
56
use std::sync::Arc;
67

78
use axum::extract::State;
@@ -22,27 +23,27 @@ use crate::v1::extractors::client_ip_sources::Extract as ExtractClientIpSources;
2223
/// authentication (no PATH `key` parameter required).
2324
#[allow(clippy::unused_async)]
2425
pub async fn handle_without_key(
25-
State(state): State<Arc<AnnounceService>>,
26+
State(state): State<(Arc<AnnounceService>, SocketAddr)>,
2627
ExtractRequest(announce_request): ExtractRequest,
2728
ExtractClientIpSources(client_ip_sources): ExtractClientIpSources,
2829
) -> Response {
2930
tracing::debug!("http announce request: {:#?}", announce_request);
3031

31-
handle(&state, &announce_request, &client_ip_sources, None).await
32+
handle(&state.0, &announce_request, &client_ip_sources, &state.1, None).await
3233
}
3334

3435
/// It handles the `announce` request when the HTTP tracker requires
3536
/// authentication (PATH `key` parameter required).
3637
#[allow(clippy::unused_async)]
3738
pub async fn handle_with_key(
38-
State(state): State<Arc<AnnounceService>>,
39+
State(state): State<(Arc<AnnounceService>, SocketAddr)>,
3940
ExtractRequest(announce_request): ExtractRequest,
4041
ExtractClientIpSources(client_ip_sources): ExtractClientIpSources,
4142
ExtractKey(key): ExtractKey,
4243
) -> Response {
4344
tracing::debug!("http announce request: {:#?}", announce_request);
4445

45-
handle(&state, &announce_request, &client_ip_sources, Some(key)).await
46+
handle(&state.0, &announce_request, &client_ip_sources, &state.1, Some(key)).await
4647
}
4748

4849
/// It handles the `announce` request.
@@ -53,9 +54,18 @@ async fn handle(
5354
announce_service: &Arc<AnnounceService>,
5455
announce_request: &Announce,
5556
client_ip_sources: &ClientIpSources,
57+
server_socket_addr: &SocketAddr,
5658
maybe_key: Option<Key>,
5759
) -> Response {
58-
let announce_data = match handle_announce(announce_service, announce_request, client_ip_sources, maybe_key).await {
60+
let announce_data = match handle_announce(
61+
announce_service,
62+
announce_request,
63+
client_ip_sources,
64+
server_socket_addr,
65+
maybe_key,
66+
)
67+
.await
68+
{
5969
Ok(announce_data) => announce_data,
6070
Err(error) => {
6171
let error_response = responses::error::Error {
@@ -71,10 +81,11 @@ async fn handle_announce(
7181
announce_service: &Arc<AnnounceService>,
7282
announce_request: &Announce,
7383
client_ip_sources: &ClientIpSources,
84+
server_socket_addr: &SocketAddr,
7485
maybe_key: Option<Key>,
7586
) -> Result<AnnounceData, HttpAnnounceError> {
7687
announce_service
77-
.handle_announce(announce_request, client_ip_sources, maybe_key)
88+
.handle_announce(announce_request, client_ip_sources, server_socket_addr, maybe_key)
7889
.await
7990
}
8091

@@ -183,7 +194,7 @@ mod tests {
183194
fn sample_client_ip_sources() -> ClientIpSources {
184195
ClientIpSources {
185196
right_most_x_forwarded_for: None,
186-
connection_info_ip: None,
197+
connection_info_socket_address: None,
187198
}
188199
}
189200

@@ -196,6 +207,7 @@ mod tests {
196207

197208
mod with_tracker_in_private_mode {
198209

210+
use std::net::{IpAddr, Ipv4Addr, SocketAddr};
199211
use std::str::FromStr;
200212

201213
use bittorrent_http_tracker_protocol::v1::responses;
@@ -209,12 +221,15 @@ mod tests {
209221
async fn it_should_fail_when_the_authentication_key_is_missing() {
210222
let http_core_tracker_services = initialize_private_tracker();
211223

224+
let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 7070);
225+
212226
let maybe_key = None;
213227

214228
let response = handle_announce(
215229
&http_core_tracker_services.announce_service,
216230
&sample_announce_request(),
217231
&sample_client_ip_sources(),
232+
&server_socket_addr,
218233
maybe_key,
219234
)
220235
.await
@@ -236,12 +251,15 @@ mod tests {
236251

237252
let unregistered_key = authentication::Key::from_str("YZSl4lMZupRuOpSRC3krIKR5BPB14nrJ").unwrap();
238253

254+
let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 7070);
255+
239256
let maybe_key = Some(unregistered_key);
240257

241258
let response = handle_announce(
242259
&http_core_tracker_services.announce_service,
243260
&sample_announce_request(),
244261
&sample_client_ip_sources(),
262+
&server_socket_addr,
245263
maybe_key,
246264
)
247265
.await
@@ -260,6 +278,8 @@ mod tests {
260278

261279
mod with_tracker_in_listed_mode {
262280

281+
use std::net::{IpAddr, Ipv4Addr, SocketAddr};
282+
263283
use bittorrent_http_tracker_protocol::v1::responses;
264284

265285
use super::{initialize_listed_tracker, sample_announce_request, sample_client_ip_sources};
@@ -272,10 +292,13 @@ mod tests {
272292

273293
let announce_request = sample_announce_request();
274294

295+
let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 7070);
296+
275297
let response = handle_announce(
276298
&http_core_tracker_services.announce_service,
277299
&announce_request,
278300
&sample_client_ip_sources(),
301+
&server_socket_addr,
279302
None,
280303
)
281304
.await
@@ -297,6 +320,8 @@ mod tests {
297320

298321
mod with_tracker_on_reverse_proxy {
299322

323+
use std::net::{IpAddr, Ipv4Addr, SocketAddr};
324+
300325
use bittorrent_http_tracker_protocol::v1::responses;
301326
use bittorrent_http_tracker_protocol::v1::services::peer_ip_resolver::ClientIpSources;
302327

@@ -310,13 +335,16 @@ mod tests {
310335

311336
let client_ip_sources = ClientIpSources {
312337
right_most_x_forwarded_for: None,
313-
connection_info_ip: None,
338+
connection_info_socket_address: None,
314339
};
315340

341+
let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 7070);
342+
316343
let response = handle_announce(
317344
&http_core_tracker_services.announce_service,
318345
&sample_announce_request(),
319346
&client_ip_sources,
347+
&server_socket_addr,
320348
None,
321349
)
322350
.await
@@ -335,6 +363,8 @@ mod tests {
335363

336364
mod with_tracker_not_on_reverse_proxy {
337365

366+
use std::net::{IpAddr, Ipv4Addr, SocketAddr};
367+
338368
use bittorrent_http_tracker_protocol::v1::responses;
339369
use bittorrent_http_tracker_protocol::v1::services::peer_ip_resolver::ClientIpSources;
340370

@@ -348,13 +378,16 @@ mod tests {
348378

349379
let client_ip_sources = ClientIpSources {
350380
right_most_x_forwarded_for: None,
351-
connection_info_ip: None,
381+
connection_info_socket_address: None,
352382
};
353383

384+
let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 7070);
385+
354386
let response = handle_announce(
355387
&http_core_tracker_services.announce_service,
356388
&sample_announce_request(),
357389
&client_ip_sources,
390+
&server_socket_addr,
358391
None,
359392
)
360393
.await

0 commit comments

Comments
 (0)