@@ -8,6 +8,7 @@ use aquatic_udp_protocol::ConnectionId;
8
8
9
9
use crate :: connection_cookie:: { gen_remote_fingerprint, make} ;
10
10
use crate :: statistics;
11
+ use crate :: statistics:: event:: ConnectionContext ;
11
12
12
13
/// The `ConnectService` is responsible for handling the `connect` requests.
13
14
///
@@ -30,16 +31,30 @@ impl ConnectService {
30
31
/// # Panics
31
32
///
32
33
/// It will panic if there was an error making the connection cookie.
33
- pub async fn handle_connect ( & self , remote_addr : SocketAddr , cookie_issue_time : f64 ) -> ConnectionId {
34
- let connection_id = make ( gen_remote_fingerprint ( & remote_addr) , cookie_issue_time) . expect ( "it should be a normal value" ) ;
34
+ pub async fn handle_connect (
35
+ & self ,
36
+ client_socket_addr : SocketAddr ,
37
+ server_socket_addr : SocketAddr ,
38
+ cookie_issue_time : f64 ,
39
+ ) -> ConnectionId {
40
+ let connection_id =
41
+ make ( gen_remote_fingerprint ( & client_socket_addr) , cookie_issue_time) . expect ( "it should be a normal value" ) ;
35
42
36
43
if let Some ( udp_stats_event_sender) = self . opt_udp_core_stats_event_sender . as_deref ( ) {
37
- match remote_addr {
44
+ match client_socket_addr {
38
45
SocketAddr :: V4 ( _) => {
39
- udp_stats_event_sender. send_event ( statistics:: event:: Event :: Udp4Connect ) . await ;
46
+ udp_stats_event_sender
47
+ . send_event ( statistics:: event:: Event :: Udp4Connect {
48
+ context : ConnectionContext :: new ( client_socket_addr, server_socket_addr) ,
49
+ } )
50
+ . await ;
40
51
}
41
52
SocketAddr :: V6 ( _) => {
42
- udp_stats_event_sender. send_event ( statistics:: event:: Event :: Udp6Connect ) . await ;
53
+ udp_stats_event_sender
54
+ . send_event ( statistics:: event:: Event :: Udp6Connect {
55
+ context : ConnectionContext :: new ( client_socket_addr, server_socket_addr) ,
56
+ } )
57
+ . await ;
43
58
}
44
59
}
45
60
}
@@ -54,6 +69,7 @@ mod tests {
54
69
mod connect_request {
55
70
56
71
use std:: future;
72
+ use std:: net:: { IpAddr , Ipv4Addr , SocketAddr } ;
57
73
use std:: sync:: Arc ;
58
74
59
75
use mockall:: predicate:: eq;
@@ -65,16 +81,19 @@ mod tests {
65
81
sample_ipv6_remote_addr_fingerprint, sample_issue_time, MockUdpCoreStatsEventSender ,
66
82
} ;
67
83
use crate :: statistics;
84
+ use crate :: statistics:: event:: ConnectionContext ;
68
85
69
86
#[ tokio:: test]
70
87
async fn a_connect_response_should_contain_the_same_transaction_id_as_the_connect_request ( ) {
88
+ let server_socket_addr = SocketAddr :: new ( IpAddr :: V4 ( Ipv4Addr :: new ( 203 , 0 , 113 , 196 ) ) , 6969 ) ;
89
+
71
90
let ( udp_core_stats_event_sender, _udp_core_stats_repository) = statistics:: setup:: factory ( false ) ;
72
91
let udp_core_stats_event_sender = Arc :: new ( udp_core_stats_event_sender) ;
73
92
74
93
let connect_service = Arc :: new ( ConnectService :: new ( udp_core_stats_event_sender) ) ;
75
94
76
95
let response = connect_service
77
- . handle_connect ( sample_ipv4_remote_addr ( ) , sample_issue_time ( ) )
96
+ . handle_connect ( sample_ipv4_remote_addr ( ) , server_socket_addr , sample_issue_time ( ) )
78
97
. await ;
79
98
80
99
assert_eq ! (
@@ -85,13 +104,15 @@ mod tests {
85
104
86
105
#[ tokio:: test]
87
106
async fn a_connect_response_should_contain_a_new_connection_id ( ) {
107
+ let server_socket_addr = SocketAddr :: new ( IpAddr :: V4 ( Ipv4Addr :: new ( 203 , 0 , 113 , 196 ) ) , 6969 ) ;
108
+
88
109
let ( udp_core_stats_event_sender, _udp_core_stats_repository) = statistics:: setup:: factory ( false ) ;
89
110
let udp_core_stats_event_sender = Arc :: new ( udp_core_stats_event_sender) ;
90
111
91
112
let connect_service = Arc :: new ( ConnectService :: new ( udp_core_stats_event_sender) ) ;
92
113
93
114
let response = connect_service
94
- . handle_connect ( sample_ipv4_remote_addr ( ) , sample_issue_time ( ) )
115
+ . handle_connect ( sample_ipv4_remote_addr ( ) , server_socket_addr , sample_issue_time ( ) )
95
116
. await ;
96
117
97
118
assert_eq ! (
@@ -102,13 +123,16 @@ mod tests {
102
123
103
124
#[ tokio:: test]
104
125
async fn a_connect_response_should_contain_a_new_connection_id_ipv6 ( ) {
126
+ let client_socket_addr = sample_ipv6_remote_addr ( ) ;
127
+ let server_socket_addr = SocketAddr :: new ( IpAddr :: V4 ( Ipv4Addr :: new ( 203 , 0 , 113 , 196 ) ) , 6969 ) ;
128
+
105
129
let ( udp_core_stats_event_sender, _udp_core_stats_repository) = statistics:: setup:: factory ( false ) ;
106
130
let udp_core_stats_event_sender = Arc :: new ( udp_core_stats_event_sender) ;
107
131
108
132
let connect_service = Arc :: new ( ConnectService :: new ( udp_core_stats_event_sender) ) ;
109
133
110
134
let response = connect_service
111
- . handle_connect ( sample_ipv6_remote_addr ( ) , sample_issue_time ( ) )
135
+ . handle_connect ( client_socket_addr , server_socket_addr , sample_issue_time ( ) )
112
136
. await ;
113
137
114
138
assert_eq ! (
@@ -119,30 +143,38 @@ mod tests {
119
143
120
144
#[ tokio:: test]
121
145
async fn it_should_send_the_upd4_connect_event_when_a_client_tries_to_connect_using_a_ip4_socket_address ( ) {
146
+ let client_socket_addr = sample_ipv4_socket_address ( ) ;
147
+ let server_socket_addr = SocketAddr :: new ( IpAddr :: V4 ( Ipv4Addr :: new ( 203 , 0 , 113 , 196 ) ) , 6969 ) ;
148
+
122
149
let mut udp_stats_event_sender_mock = MockUdpCoreStatsEventSender :: new ( ) ;
123
150
udp_stats_event_sender_mock
124
151
. expect_send_event ( )
125
- . with ( eq ( statistics:: event:: Event :: Udp4Connect ) )
152
+ . with ( eq ( statistics:: event:: Event :: Udp4Connect {
153
+ context : ConnectionContext :: new ( client_socket_addr, server_socket_addr) ,
154
+ } ) )
126
155
. times ( 1 )
127
156
. returning ( |_| Box :: pin ( future:: ready ( Some ( Ok ( ( ) ) ) ) ) ) ;
128
157
let opt_udp_stats_event_sender: Arc < Option < Box < dyn statistics:: event:: sender:: Sender > > > =
129
158
Arc :: new ( Some ( Box :: new ( udp_stats_event_sender_mock) ) ) ;
130
159
131
- let client_socket_address = sample_ipv4_socket_address ( ) ;
132
-
133
160
let connect_service = Arc :: new ( ConnectService :: new ( opt_udp_stats_event_sender) ) ;
134
161
135
162
connect_service
136
- . handle_connect ( client_socket_address , sample_issue_time ( ) )
163
+ . handle_connect ( client_socket_addr , server_socket_addr , sample_issue_time ( ) )
137
164
. await ;
138
165
}
139
166
140
167
#[ tokio:: test]
141
168
async fn it_should_send_the_upd6_connect_event_when_a_client_tries_to_connect_using_a_ip6_socket_address ( ) {
169
+ let client_socket_addr = sample_ipv6_remote_addr ( ) ;
170
+ let server_socket_addr = SocketAddr :: new ( IpAddr :: V4 ( Ipv4Addr :: new ( 203 , 0 , 113 , 196 ) ) , 6969 ) ;
171
+
142
172
let mut udp_stats_event_sender_mock = MockUdpCoreStatsEventSender :: new ( ) ;
143
173
udp_stats_event_sender_mock
144
174
. expect_send_event ( )
145
- . with ( eq ( statistics:: event:: Event :: Udp6Connect ) )
175
+ . with ( eq ( statistics:: event:: Event :: Udp6Connect {
176
+ context : ConnectionContext :: new ( client_socket_addr, server_socket_addr) ,
177
+ } ) )
146
178
. times ( 1 )
147
179
. returning ( |_| Box :: pin ( future:: ready ( Some ( Ok ( ( ) ) ) ) ) ) ;
148
180
let opt_udp_stats_event_sender: Arc < Option < Box < dyn statistics:: event:: sender:: Sender > > > =
@@ -151,7 +183,7 @@ mod tests {
151
183
let connect_service = Arc :: new ( ConnectService :: new ( opt_udp_stats_event_sender) ) ;
152
184
153
185
connect_service
154
- . handle_connect ( sample_ipv6_remote_addr ( ) , sample_issue_time ( ) )
186
+ . handle_connect ( client_socket_addr , server_socket_addr , sample_issue_time ( ) )
155
187
. await ;
156
188
}
157
189
}
0 commit comments