Skip to content

Commit 27e2db4

Browse files
committed
refactor: [#1382] include req kin in UDP error response if it's known
It could be unkown if the request couldb be parsed succesfully.
1 parent 625d20a commit 27e2db4

File tree

7 files changed

+71
-38
lines changed

7 files changed

+71
-38
lines changed

packages/udp-tracker-server/src/handlers/announce.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ pub async fn handle_announce(
3232
core_config: &Arc<Core>,
3333
opt_udp_server_stats_event_sender: &Arc<Option<Box<dyn server_statistics::event::sender::Sender>>>,
3434
cookie_valid_range: Range<f64>,
35-
) -> Result<Response, (Error, TransactionId)> {
35+
) -> Result<Response, (Error, TransactionId, UdpRequestKind)> {
3636
tracing::Span::current()
3737
.record("transaction_id", request.transaction_id.0.to_string())
3838
.record("connection_id", request.connection_id.0.to_string())
@@ -52,7 +52,7 @@ pub async fn handle_announce(
5252
let announce_data = announce_service
5353
.handle_announce(client_socket_addr, server_socket_addr, request, cookie_valid_range)
5454
.await
55-
.map_err(|e| (e.into(), request.transaction_id))?;
55+
.map_err(|e| (e.into(), request.transaction_id, UdpRequestKind::Announce))?;
5656

5757
Ok(build_response(client_socket_addr, request, core_config, &announce_data))
5858
}

packages/udp-tracker-server/src/handlers/error.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,12 @@ use zerocopy::network_endian::I32;
1212

1313
use crate::error::Error;
1414
use crate::statistics as server_statistics;
15-
use crate::statistics::event::ConnectionContext;
15+
use crate::statistics::event::{ConnectionContext, UdpRequestKind};
1616

1717
#[allow(clippy::too_many_arguments)]
1818
#[instrument(fields(transaction_id), skip(opt_udp_server_stats_event_sender), ret(level = Level::TRACE))]
1919
pub async fn handle_error(
20+
req_kind: Option<UdpRequestKind>,
2021
client_socket_addr: SocketAddr,
2122
server_socket_addr: SocketAddr,
2223
request_id: Uuid,

packages/udp-tracker-server/src/handlers/mod.rs

+39-21
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ use uuid::Uuid;
2424
use super::RawRequest;
2525
use crate::container::UdpTrackerServerContainer;
2626
use crate::error::Error;
27+
use crate::statistics::event::UdpRequestKind;
2728
use crate::CurrentClock;
2829

2930
#[derive(Debug, Clone, PartialEq)]
@@ -60,15 +61,15 @@ pub(crate) async fn handle_packet(
6061
udp_tracker_server_container: Arc<UdpTrackerServerContainer>,
6162
server_socket_addr: SocketAddr,
6263
cookie_time_values: CookieTimeValues,
63-
) -> Response {
64+
) -> (Response, Option<UdpRequestKind>) {
6465
let request_id = Uuid::new_v4();
6566

6667
tracing::Span::current().record("request_id", request_id.to_string());
6768
tracing::debug!("Handling Packets: {udp_request:?}");
6869

6970
let start_time = Instant::now();
7071

71-
let response =
72+
let (response, opt_req_kind) =
7273
match Request::parse_bytes(&udp_request.payload[..udp_request.payload.len()], MAX_SCRAPE_TORRENTS).map_err(Error::from) {
7374
Ok(request) => match handle_request(
7475
request,
@@ -80,8 +81,8 @@ pub(crate) async fn handle_packet(
8081
)
8182
.await
8283
{
83-
Ok(response) => return response,
84-
Err((error, transaction_id)) => {
84+
Ok((response, req_kid)) => return (response, Some(req_kid)),
85+
Err((error, transaction_id, req_kind)) => {
8586
if let Error::UdpAnnounceError {
8687
source: UdpAnnounceError::ConnectionCookieError { .. },
8788
} = error
@@ -91,7 +92,8 @@ pub(crate) async fn handle_packet(
9192
ban_service.increase_counter(&udp_request.from.ip());
9293
}
9394

94-
handle_error(
95+
let response = handle_error(
96+
Some(req_kind.clone()),
9597
udp_request.from,
9698
server_socket_addr,
9799
request_id,
@@ -100,11 +102,14 @@ pub(crate) async fn handle_packet(
100102
&error,
101103
Some(transaction_id),
102104
)
103-
.await
105+
.await;
106+
107+
(response, Some(req_kind))
104108
}
105109
},
106110
Err(e) => {
107-
handle_error(
111+
let response = handle_error(
112+
None,
108113
udp_request.from,
109114
server_socket_addr,
110115
request_id,
@@ -113,14 +118,16 @@ pub(crate) async fn handle_packet(
113118
&e,
114119
None,
115120
)
116-
.await
121+
.await;
122+
123+
(response, None)
117124
}
118125
};
119126

120127
let latency = start_time.elapsed();
121128
tracing::trace!(?latency, "responded");
122129

123-
response
130+
(response, opt_req_kind)
124131
}
125132

126133
/// It dispatches the request to the correct handler.
@@ -143,21 +150,24 @@ pub async fn handle_request(
143150
udp_tracker_core_container: Arc<UdpTrackerCoreContainer>,
144151
udp_tracker_server_container: Arc<UdpTrackerServerContainer>,
145152
cookie_time_values: CookieTimeValues,
146-
) -> Result<Response, (Error, TransactionId)> {
153+
) -> Result<(Response, UdpRequestKind), (Error, TransactionId, UdpRequestKind)> {
147154
tracing::trace!("handle request");
148155

149156
match request {
150-
Request::Connect(connect_request) => Ok(handle_connect(
151-
client_socket_addr,
152-
server_socket_addr,
153-
&connect_request,
154-
&udp_tracker_core_container.connect_service,
155-
&udp_tracker_server_container.udp_server_stats_event_sender,
156-
cookie_time_values.issue_time,
157-
)
158-
.await),
157+
Request::Connect(connect_request) => Ok((
158+
handle_connect(
159+
client_socket_addr,
160+
server_socket_addr,
161+
&connect_request,
162+
&udp_tracker_core_container.connect_service,
163+
&udp_tracker_server_container.udp_server_stats_event_sender,
164+
cookie_time_values.issue_time,
165+
)
166+
.await,
167+
UdpRequestKind::Connect,
168+
)),
159169
Request::Announce(announce_request) => {
160-
handle_announce(
170+
match handle_announce(
161171
&udp_tracker_core_container.announce_service,
162172
client_socket_addr,
163173
server_socket_addr,
@@ -167,9 +177,13 @@ pub async fn handle_request(
167177
cookie_time_values.valid_range,
168178
)
169179
.await
180+
{
181+
Ok(response) => Ok((response, UdpRequestKind::Announce)),
182+
Err(err) => Err(err),
183+
}
170184
}
171185
Request::Scrape(scrape_request) => {
172-
handle_scrape(
186+
match handle_scrape(
173187
&udp_tracker_core_container.scrape_service,
174188
client_socket_addr,
175189
server_socket_addr,
@@ -178,6 +192,10 @@ pub async fn handle_request(
178192
cookie_time_values.valid_range,
179193
)
180194
.await
195+
{
196+
Ok(response) => Ok((response, UdpRequestKind::Scrape)),
197+
Err(err) => Err(err),
198+
}
181199
}
182200
}
183201
}

packages/udp-tracker-server/src/handlers/scrape.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ pub async fn handle_scrape(
2929
request: &ScrapeRequest,
3030
opt_udp_server_stats_event_sender: &Arc<Option<Box<dyn server_statistics::event::sender::Sender>>>,
3131
cookie_valid_range: Range<f64>,
32-
) -> Result<Response, (Error, TransactionId)> {
32+
) -> Result<Response, (Error, TransactionId, UdpRequestKind)> {
3333
tracing::Span::current()
3434
.record("transaction_id", request.transaction_id.0.to_string())
3535
.record("connection_id", request.connection_id.0.to_string());
@@ -48,7 +48,7 @@ pub async fn handle_scrape(
4848
let scrape_data = scrape_service
4949
.handle_scrape(client_socket_addr, server_socket_addr, request, cookie_valid_range)
5050
.await
51-
.map_err(|e| (e.into(), request.transaction_id))?;
51+
.map_err(|e| (e.into(), request.transaction_id, UdpRequestKind::Scrape))?;
5252

5353
Ok(build_response(request, &scrape_data))
5454
}

packages/udp-tracker-server/src/server/processor.rs

+12-5
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ use tracing::{instrument, Level};
1212
use super::bound_socket::BoundSocket;
1313
use crate::container::UdpTrackerServerContainer;
1414
use crate::handlers::CookieTimeValues;
15-
use crate::statistics::event::ConnectionContext;
15+
use crate::statistics::event::{ConnectionContext, UdpRequestKind};
1616
use crate::{handlers, statistics, RawRequest};
1717

1818
pub struct Processor {
@@ -43,7 +43,7 @@ impl Processor {
4343

4444
let start_time = Instant::now();
4545

46-
let response = handlers::handle_packet(
46+
let (response, opt_req_kind) = handlers::handle_packet(
4747
request,
4848
self.udp_tracker_core_container.clone(),
4949
self.udp_tracker_server_container.clone(),
@@ -54,11 +54,18 @@ impl Processor {
5454

5555
let elapsed_time = start_time.elapsed();
5656

57-
self.send_response(client_socket_addr, response, elapsed_time).await;
57+
self.send_response(client_socket_addr, response, opt_req_kind, elapsed_time)
58+
.await;
5859
}
5960

6061
#[instrument(skip(self))]
61-
async fn send_response(self, client_socket_addr: SocketAddr, response: Response, req_processing_time: Duration) {
62+
async fn send_response(
63+
self,
64+
client_socket_addr: SocketAddr,
65+
response: Response,
66+
opt_req_kind: Option<UdpRequestKind>,
67+
req_processing_time: Duration,
68+
) {
6269
tracing::debug!("send response");
6370

6471
let response_type = match &response {
@@ -79,7 +86,7 @@ impl Processor {
7986
Response::Scrape(_) => statistics::event::UdpResponseKind::Ok {
8087
req_kind: statistics::event::UdpRequestKind::Scrape,
8188
},
82-
Response::Error(_e) => statistics::event::UdpResponseKind::Error,
89+
Response::Error(_e) => statistics::event::UdpResponseKind::Error { opt_req_kind: None },
8390
};
8491

8592
let mut writer = Cursor::new(Vec::with_capacity(200));

packages/udp-tracker-server/src/statistics/event/handler.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ pub async fn handle_event(event: Event, stats_repository: &Repository) {
8080
.await;
8181
}
8282
},
83-
UdpResponseKind::Error => {}
83+
UdpResponseKind::Error { opt_req_kind: _ } => {}
8484
}
8585
}
8686
Event::UdpError { context } => match context.client_socket_addr().ip() {

packages/udp-tracker-server/src/statistics/event/mod.rs

+13-6
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ pub mod listener;
66
pub mod sender;
77

88
/// An statistics event. It is used to collect tracker metrics.
9-
#[derive(Debug, PartialEq, Eq)]
9+
#[derive(Debug, PartialEq, Eq, Clone)]
1010
pub enum Event {
1111
UdpIncomingRequest {
1212
context: ConnectionContext,
@@ -31,20 +31,27 @@ pub enum Event {
3131
},
3232
}
3333

34-
#[derive(Debug, PartialEq, Eq)]
34+
#[derive(Debug, PartialEq, Eq, Clone)]
3535
pub enum UdpRequestKind {
3636
Connect,
3737
Announce,
3838
Scrape,
3939
}
4040

41-
#[derive(Debug, PartialEq, Eq)]
41+
#[derive(Debug, PartialEq, Eq, Clone)]
4242
pub enum UdpResponseKind {
43-
Ok { req_kind: UdpRequestKind },
44-
Error, // todo: add the request kind `{ req_kind: Option(UdpRequestKind) }` when we know it.
43+
Ok {
44+
req_kind: UdpRequestKind,
45+
},
46+
47+
/// There was an error handling the requests. The error contains the request
48+
/// kind if the request was parsed successfully.
49+
Error {
50+
opt_req_kind: Option<UdpRequestKind>,
51+
},
4552
}
4653

47-
#[derive(Debug, PartialEq, Eq)]
54+
#[derive(Debug, PartialEq, Eq, Clone)]
4855
pub struct ConnectionContext {
4956
client_socket_addr: SocketAddr,
5057
server_socket_addr: SocketAddr,

0 commit comments

Comments
 (0)