1
1
//! Handlers for the UDP server.
2
+ use std:: fmt;
2
3
use std:: net:: { IpAddr , Ipv4Addr , Ipv6Addr , SocketAddr } ;
3
4
use std:: panic:: Location ;
4
5
use std:: sync:: Arc ;
@@ -7,13 +8,16 @@ use aquatic_udp_protocol::{
7
8
AnnounceInterval , AnnounceRequest , AnnounceResponse , ConnectRequest , ConnectResponse , ErrorResponse , NumberOfDownloads ,
8
9
NumberOfPeers , Port , Request , Response , ResponsePeer , ScrapeRequest , ScrapeResponse , TorrentScrapeStatistics , TransactionId ,
9
10
} ;
10
- use log:: { debug, info} ;
11
+ use log:: debug;
12
+ use tokio:: net:: UdpSocket ;
11
13
use torrust_tracker_located_error:: DynError ;
14
+ use uuid:: Uuid ;
12
15
13
16
use super :: connection_cookie:: { check, from_connection_id, into_connection_id, make} ;
14
17
use super :: UdpRequest ;
15
18
use crate :: core:: { statistics, ScrapeData , Tracker } ;
16
19
use crate :: servers:: udp:: error:: Error ;
20
+ use crate :: servers:: udp:: logging:: { log_bad_request, log_error_response, log_request, log_response} ;
17
21
use crate :: servers:: udp:: peer_builder;
18
22
use crate :: servers:: udp:: request:: AnnounceWrapper ;
19
23
use crate :: shared:: bit_torrent:: common:: MAX_SCRAPE_TORRENTS ;
@@ -28,33 +32,50 @@ use crate::shared::bit_torrent::info_hash::InfoHash;
28
32
/// type.
29
33
///
30
34
/// It will return an `Error` response if the request is invalid.
31
- pub ( crate ) async fn handle_packet ( udp_request : UdpRequest , tracker : & Arc < Tracker > ) -> Response {
35
+ pub ( crate ) async fn handle_packet ( udp_request : UdpRequest , tracker : & Arc < Tracker > , socket : Arc < UdpSocket > ) -> Response {
32
36
debug ! ( "Handling Packets: {udp_request:?}" ) ;
37
+
38
+ let request_id = RequestId :: make ( & udp_request) ;
39
+ let server_socket_addr = socket. local_addr ( ) . expect ( "Could not get local_addr for socket." ) ;
40
+
33
41
match Request :: from_bytes ( & udp_request. payload [ ..udp_request. payload . len ( ) ] , MAX_SCRAPE_TORRENTS ) . map_err ( |e| {
34
42
Error :: InternalServer {
35
43
message : format ! ( "{e:?}" ) ,
36
44
location : Location :: caller ( ) ,
37
45
}
38
46
} ) {
39
47
Ok ( request) => {
48
+ log_request ( & request, & request_id, & server_socket_addr) ;
49
+
40
50
let transaction_id = match & request {
41
51
Request :: Connect ( connect_request) => connect_request. transaction_id ,
42
52
Request :: Announce ( announce_request) => announce_request. transaction_id ,
43
53
Request :: Scrape ( scrape_request) => scrape_request. transaction_id ,
44
54
} ;
45
55
46
- match handle_request ( request, udp_request. from , tracker) . await {
56
+ let response = match handle_request ( request, udp_request. from , tracker) . await {
47
57
Ok ( response) => response,
48
58
Err ( e) => handle_error ( & e, transaction_id) ,
49
- }
59
+ } ;
60
+
61
+ log_response ( & response, & transaction_id, & request_id, & server_socket_addr) ;
62
+
63
+ response
64
+ }
65
+ Err ( e) => {
66
+ log_bad_request ( & request_id) ;
67
+
68
+ let response = handle_error (
69
+ & Error :: BadRequest {
70
+ source : ( Arc :: new ( e) as DynError ) . into ( ) ,
71
+ } ,
72
+ TransactionId ( 0 ) ,
73
+ ) ;
74
+
75
+ log_error_response ( & request_id) ;
76
+
77
+ response
50
78
}
51
- // bad request
52
- Err ( e) => handle_error (
53
- & Error :: BadRequest {
54
- source : ( Arc :: new ( e) as DynError ) . into ( ) ,
55
- } ,
56
- TransactionId ( 0 ) ,
57
- ) ,
58
79
}
59
80
}
60
81
@@ -80,7 +101,6 @@ pub async fn handle_request(request: Request, remote_addr: SocketAddr, tracker:
80
101
///
81
102
/// This function does not ever return an error.
82
103
pub async fn handle_connect ( remote_addr : SocketAddr , request : & ConnectRequest , tracker : & Tracker ) -> Result < Response , Error > {
83
- info ! ( target: "UDP" , "\" CONNECT TxID {}\" " , request. transaction_id. 0 ) ;
84
104
debug ! ( "udp connect request: {:#?}" , request) ;
85
105
86
106
let connection_cookie = make ( & remote_addr) ;
@@ -138,8 +158,6 @@ pub async fn handle_announce(
138
158
source : ( Arc :: new ( e) as Arc < dyn std:: error:: Error + Send + Sync > ) . into ( ) ,
139
159
} ) ?;
140
160
141
- info ! ( target: "UDP" , "\" ANNOUNCE TxID {} IH {}\" " , announce_request. transaction_id. 0 , info_hash. to_hex_string( ) ) ;
142
-
143
161
let mut peer = peer_builder:: from_request ( & wrapped_announce_request, & remote_client_ip) ;
144
162
145
163
let response = tracker. announce ( & info_hash, & mut peer, & remote_client_ip) . await ;
@@ -214,7 +232,6 @@ pub async fn handle_announce(
214
232
///
215
233
/// This function does not ever return an error.
216
234
pub async fn handle_scrape ( remote_addr : SocketAddr , request : & ScrapeRequest , tracker : & Tracker ) -> Result < Response , Error > {
217
- info ! ( target: "UDP" , "\" SCRAPE TxID {}\" " , request. transaction_id. 0 ) ;
218
235
debug ! ( "udp scrape request: {:#?}" , request) ;
219
236
220
237
// Convert from aquatic infohashes
@@ -274,6 +291,22 @@ fn handle_error(e: &Error, transaction_id: TransactionId) -> Response {
274
291
} )
275
292
}
276
293
294
+ /// An identifier for a request.
295
+ #[ derive( Debug , Clone ) ]
296
+ pub struct RequestId ( Uuid ) ;
297
+
298
+ impl RequestId {
299
+ fn make ( _request : & UdpRequest ) -> RequestId {
300
+ RequestId ( Uuid :: new_v4 ( ) )
301
+ }
302
+ }
303
+
304
+ impl fmt:: Display for RequestId {
305
+ fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
306
+ write ! ( f, "{}" , self . 0 )
307
+ }
308
+ }
309
+
277
310
#[ cfg( test) ]
278
311
mod tests {
279
312
0 commit comments