@@ -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,18 +31,21 @@ 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 {
38
- SocketAddr :: V4 ( _) => {
39
- udp_stats_event_sender. send_event ( statistics:: event:: Event :: Udp4Connect ) . await ;
40
- }
41
- SocketAddr :: V6 ( _) => {
42
- udp_stats_event_sender. send_event ( statistics:: event:: Event :: Udp6Connect ) . await ;
43
- }
44
- }
44
+ udp_stats_event_sender
45
+ . send_event ( statistics:: event:: Event :: UdpConnect {
46
+ context : ConnectionContext :: new ( client_socket_addr, server_socket_addr) ,
47
+ } )
48
+ . await ;
45
49
}
46
50
47
51
connection_id
@@ -54,6 +58,7 @@ mod tests {
54
58
mod connect_request {
55
59
56
60
use std:: future;
61
+ use std:: net:: { IpAddr , Ipv4Addr , SocketAddr } ;
57
62
use std:: sync:: Arc ;
58
63
59
64
use mockall:: predicate:: eq;
@@ -65,16 +70,19 @@ mod tests {
65
70
sample_ipv6_remote_addr_fingerprint, sample_issue_time, MockUdpCoreStatsEventSender ,
66
71
} ;
67
72
use crate :: statistics;
73
+ use crate :: statistics:: event:: ConnectionContext ;
68
74
69
75
#[ tokio:: test]
70
76
async fn a_connect_response_should_contain_the_same_transaction_id_as_the_connect_request ( ) {
77
+ let server_socket_addr = SocketAddr :: new ( IpAddr :: V4 ( Ipv4Addr :: new ( 203 , 0 , 113 , 196 ) ) , 6969 ) ;
78
+
71
79
let ( udp_core_stats_event_sender, _udp_core_stats_repository) = statistics:: setup:: factory ( false ) ;
72
80
let udp_core_stats_event_sender = Arc :: new ( udp_core_stats_event_sender) ;
73
81
74
82
let connect_service = Arc :: new ( ConnectService :: new ( udp_core_stats_event_sender) ) ;
75
83
76
84
let response = connect_service
77
- . handle_connect ( sample_ipv4_remote_addr ( ) , sample_issue_time ( ) )
85
+ . handle_connect ( sample_ipv4_remote_addr ( ) , server_socket_addr , sample_issue_time ( ) )
78
86
. await ;
79
87
80
88
assert_eq ! (
@@ -85,13 +93,15 @@ mod tests {
85
93
86
94
#[ tokio:: test]
87
95
async fn a_connect_response_should_contain_a_new_connection_id ( ) {
96
+ let server_socket_addr = SocketAddr :: new ( IpAddr :: V4 ( Ipv4Addr :: new ( 203 , 0 , 113 , 196 ) ) , 6969 ) ;
97
+
88
98
let ( udp_core_stats_event_sender, _udp_core_stats_repository) = statistics:: setup:: factory ( false ) ;
89
99
let udp_core_stats_event_sender = Arc :: new ( udp_core_stats_event_sender) ;
90
100
91
101
let connect_service = Arc :: new ( ConnectService :: new ( udp_core_stats_event_sender) ) ;
92
102
93
103
let response = connect_service
94
- . handle_connect ( sample_ipv4_remote_addr ( ) , sample_issue_time ( ) )
104
+ . handle_connect ( sample_ipv4_remote_addr ( ) , server_socket_addr , sample_issue_time ( ) )
95
105
. await ;
96
106
97
107
assert_eq ! (
@@ -102,13 +112,16 @@ mod tests {
102
112
103
113
#[ tokio:: test]
104
114
async fn a_connect_response_should_contain_a_new_connection_id_ipv6 ( ) {
115
+ let client_socket_addr = sample_ipv6_remote_addr ( ) ;
116
+ let server_socket_addr = SocketAddr :: new ( IpAddr :: V4 ( Ipv4Addr :: new ( 203 , 0 , 113 , 196 ) ) , 6969 ) ;
117
+
105
118
let ( udp_core_stats_event_sender, _udp_core_stats_repository) = statistics:: setup:: factory ( false ) ;
106
119
let udp_core_stats_event_sender = Arc :: new ( udp_core_stats_event_sender) ;
107
120
108
121
let connect_service = Arc :: new ( ConnectService :: new ( udp_core_stats_event_sender) ) ;
109
122
110
123
let response = connect_service
111
- . handle_connect ( sample_ipv6_remote_addr ( ) , sample_issue_time ( ) )
124
+ . handle_connect ( client_socket_addr , server_socket_addr , sample_issue_time ( ) )
112
125
. await ;
113
126
114
127
assert_eq ! (
@@ -119,30 +132,38 @@ mod tests {
119
132
120
133
#[ tokio:: test]
121
134
async fn it_should_send_the_upd4_connect_event_when_a_client_tries_to_connect_using_a_ip4_socket_address ( ) {
135
+ let client_socket_addr = sample_ipv4_socket_address ( ) ;
136
+ let server_socket_addr = SocketAddr :: new ( IpAddr :: V4 ( Ipv4Addr :: new ( 203 , 0 , 113 , 196 ) ) , 6969 ) ;
137
+
122
138
let mut udp_stats_event_sender_mock = MockUdpCoreStatsEventSender :: new ( ) ;
123
139
udp_stats_event_sender_mock
124
140
. expect_send_event ( )
125
- . with ( eq ( statistics:: event:: Event :: Udp4Connect ) )
141
+ . with ( eq ( statistics:: event:: Event :: UdpConnect {
142
+ context : ConnectionContext :: new ( client_socket_addr, server_socket_addr) ,
143
+ } ) )
126
144
. times ( 1 )
127
145
. returning ( |_| Box :: pin ( future:: ready ( Some ( Ok ( ( ) ) ) ) ) ) ;
128
146
let opt_udp_stats_event_sender: Arc < Option < Box < dyn statistics:: event:: sender:: Sender > > > =
129
147
Arc :: new ( Some ( Box :: new ( udp_stats_event_sender_mock) ) ) ;
130
148
131
- let client_socket_address = sample_ipv4_socket_address ( ) ;
132
-
133
149
let connect_service = Arc :: new ( ConnectService :: new ( opt_udp_stats_event_sender) ) ;
134
150
135
151
connect_service
136
- . handle_connect ( client_socket_address , sample_issue_time ( ) )
152
+ . handle_connect ( client_socket_addr , server_socket_addr , sample_issue_time ( ) )
137
153
. await ;
138
154
}
139
155
140
156
#[ tokio:: test]
141
157
async fn it_should_send_the_upd6_connect_event_when_a_client_tries_to_connect_using_a_ip6_socket_address ( ) {
158
+ let client_socket_addr = sample_ipv6_remote_addr ( ) ;
159
+ let server_socket_addr = SocketAddr :: new ( IpAddr :: V4 ( Ipv4Addr :: new ( 203 , 0 , 113 , 196 ) ) , 6969 ) ;
160
+
142
161
let mut udp_stats_event_sender_mock = MockUdpCoreStatsEventSender :: new ( ) ;
143
162
udp_stats_event_sender_mock
144
163
. expect_send_event ( )
145
- . with ( eq ( statistics:: event:: Event :: Udp6Connect ) )
164
+ . with ( eq ( statistics:: event:: Event :: UdpConnect {
165
+ context : ConnectionContext :: new ( client_socket_addr, server_socket_addr) ,
166
+ } ) )
146
167
. times ( 1 )
147
168
. returning ( |_| Box :: pin ( future:: ready ( Some ( Ok ( ( ) ) ) ) ) ) ;
148
169
let opt_udp_stats_event_sender: Arc < Option < Box < dyn statistics:: event:: sender:: Sender > > > =
@@ -151,7 +172,7 @@ mod tests {
151
172
let connect_service = Arc :: new ( ConnectService :: new ( opt_udp_stats_event_sender) ) ;
152
173
153
174
connect_service
154
- . handle_connect ( sample_ipv6_remote_addr ( ) , sample_issue_time ( ) )
175
+ . handle_connect ( client_socket_addr , server_socket_addr , sample_issue_time ( ) )
155
176
. await ;
156
177
}
157
178
}
0 commit comments