1
- use std:: fmt:: Debug ;
1
+ use std:: { fmt:: Debug , net :: { AddrParseError , SocketAddr } } ;
2
2
3
3
use bytes:: { Bytes , BytesMut } ;
4
4
use url:: { ParseError , Url } ;
@@ -37,6 +37,8 @@ pub struct Request {
37
37
headers : Headers ,
38
38
// TODO: Support Stream bodies when napi.rs supports it
39
39
body : Bytes ,
40
+ local_socket : Option < SocketAddr > ,
41
+ remote_socket : Option < SocketAddr > ,
40
42
}
41
43
42
44
unsafe impl Sync for Request { }
@@ -57,14 +59,18 @@ impl Request {
57
59
/// "POST".to_string(),
58
60
/// "http://example.com/test.php".parse().unwrap(),
59
61
/// headers,
60
- /// "Hello, World!"
62
+ /// "Hello, World!",
63
+ /// None,
64
+ /// None,
61
65
/// );
62
- pub fn new < T : Into < Bytes > > ( method : String , url : Url , headers : Headers , body : T ) -> Self {
66
+ pub fn new < T : Into < Bytes > > ( method : String , url : Url , headers : Headers , body : T , local_socket : Option < SocketAddr > , remote_socket : Option < SocketAddr > ) -> Self {
63
67
Self {
64
68
method,
65
69
url,
66
70
headers,
67
71
body : body. into ( ) ,
72
+ local_socket,
73
+ remote_socket,
68
74
}
69
75
}
70
76
@@ -133,7 +139,9 @@ impl Request {
133
139
/// "POST".to_string(),
134
140
/// "http://example.com/test.php".parse().unwrap(),
135
141
/// Headers::new(),
136
- /// "Hello, World!"
142
+ /// "Hello, World!",
143
+ /// None,
144
+ /// None,
137
145
/// );
138
146
///
139
147
/// assert_eq!(request.method(), "POST");
@@ -153,7 +161,9 @@ impl Request {
153
161
/// "POST".to_string(),
154
162
/// "http://example.com/test.php".parse().unwrap(),
155
163
/// Headers::new(),
156
- /// "Hello, World!"
164
+ /// "Hello, World!",
165
+ /// None,
166
+ /// None,
157
167
/// );
158
168
///
159
169
/// assert_eq!(request.url().as_str(), "http://example.com/test.php");
@@ -176,7 +186,9 @@ impl Request {
176
186
/// "POST".to_string(),
177
187
/// "http://example.com/test.php".parse().unwrap(),
178
188
/// headers,
179
- /// "Hello, World!"
189
+ /// "Hello, World!",
190
+ /// None,
191
+ /// None,
180
192
/// );
181
193
///
182
194
/// assert_eq!(request.headers().get("Accept"), Some(&vec!["text/html".to_string()]));
@@ -196,14 +208,60 @@ impl Request {
196
208
/// "POST".to_string(),
197
209
/// "http://example.com/test.php".parse().unwrap(),
198
210
/// Headers::new(),
199
- /// "Hello, World!"
211
+ /// "Hello, World!",
212
+ /// None,
213
+ /// None,
200
214
/// );
201
215
///
202
216
/// assert_eq!(request.body(), "Hello, World!");
203
217
/// ```
204
218
pub fn body ( & self ) -> Bytes {
205
219
self . body . clone ( )
206
220
}
221
+
222
+ /// Returns the local socket address of the request.
223
+ ///
224
+ /// # Examples
225
+ ///
226
+ /// ```
227
+ /// use lang_handler::{Request, Headers};
228
+ ///
229
+ /// let request = Request::new(
230
+ /// "POST".to_string(),
231
+ /// "http://example.com/test.php".parse().unwrap(),
232
+ /// Headers::new(),
233
+ /// "Hello, World!",
234
+ /// None,
235
+ /// None,
236
+ /// );
237
+ ///
238
+ /// assert_eq!(request.local_socket(), None);
239
+ /// ```
240
+ pub fn local_socket ( & self ) -> Option < SocketAddr > {
241
+ self . local_socket
242
+ }
243
+
244
+ /// Returns the remote socket address of the request.
245
+ ///
246
+ /// # Examples
247
+ ///
248
+ /// ```
249
+ /// use lang_handler::{Request, Headers};
250
+ ///
251
+ /// let request = Request::new(
252
+ /// "POST".to_string(),
253
+ /// "http://example.com/test.php".parse().unwrap(),
254
+ /// Headers::new(),
255
+ /// "Hello, World!",
256
+ /// None,
257
+ /// None,
258
+ /// );
259
+ ///
260
+ /// assert_eq!(request.remote_socket(), None);
261
+ /// ```
262
+ pub fn remote_socket ( & self ) -> Option < SocketAddr > {
263
+ self . remote_socket
264
+ }
207
265
}
208
266
209
267
/// Builds an HTTP request.
@@ -233,6 +291,8 @@ pub struct RequestBuilder {
233
291
url : Option < Url > ,
234
292
headers : Headers ,
235
293
body : BytesMut ,
294
+ local_socket : Option < SocketAddr > ,
295
+ remote_socket : Option < SocketAddr > ,
236
296
}
237
297
238
298
impl RequestBuilder {
@@ -251,6 +311,8 @@ impl RequestBuilder {
251
311
url : None ,
252
312
headers : Headers :: new ( ) ,
253
313
body : BytesMut :: with_capacity ( 1024 ) ,
314
+ local_socket : None ,
315
+ remote_socket : None ,
254
316
}
255
317
}
256
318
@@ -285,6 +347,8 @@ impl RequestBuilder {
285
347
url : Some ( request. url ( ) . clone ( ) ) ,
286
348
headers : request. headers ( ) . clone ( ) ,
287
349
body : BytesMut :: from ( request. body ( ) ) ,
350
+ local_socket : request. local_socket . clone ( ) ,
351
+ remote_socket : request. remote_socket . clone ( ) ,
288
352
}
289
353
}
290
354
@@ -372,6 +436,58 @@ impl RequestBuilder {
372
436
self
373
437
}
374
438
439
+ /// Sets the local socket of the request.
440
+ ///
441
+ /// # Examples
442
+ ///
443
+ /// ```
444
+ /// use lang_handler::RequestBuilder;
445
+ ///
446
+ /// let request = RequestBuilder::new()
447
+ /// .local_socket("127.0.0.1:8080").expect("invalid local socket")
448
+ /// .build();
449
+ ///
450
+ /// assert_eq!(request.local_socket(), "127.0.0.1:8080");
451
+ /// ```
452
+ pub fn local_socket < T > ( mut self , local_socket : T ) -> Result < Self , AddrParseError >
453
+ where
454
+ T : Into < String > ,
455
+ {
456
+ match local_socket. into ( ) . parse ( ) {
457
+ Err ( e) => Err ( e) ,
458
+ Ok ( local_socket) => {
459
+ self . local_socket = Some ( local_socket) ;
460
+ Ok ( self )
461
+ }
462
+ }
463
+ }
464
+
465
+ /// Sets the remote socket of the request.
466
+ ///
467
+ /// # Examples
468
+ ///
469
+ /// ```
470
+ /// use lang_handler::RequestBuilder;
471
+ ///
472
+ /// let request = RequestBuilder::new()
473
+ /// .remote_socket("127.0.0.1:8080").expect("invalid remote socket")
474
+ /// .build();
475
+ ///
476
+ /// assert_eq!(request.remote_socket(), "127.0.0.1:8080");
477
+ /// ```
478
+ pub fn remote_socket < T > ( mut self , remote_socket : T ) -> Result < Self , AddrParseError >
479
+ where
480
+ T : Into < String > ,
481
+ {
482
+ match remote_socket. into ( ) . parse ( ) {
483
+ Err ( e) => Err ( e) ,
484
+ Ok ( remote_socket) => {
485
+ self . remote_socket = Some ( remote_socket) ;
486
+ Ok ( self )
487
+ }
488
+ }
489
+ }
490
+
375
491
/// Builds the request.
376
492
///
377
493
/// # Examples
@@ -395,6 +511,8 @@ impl RequestBuilder {
395
511
. unwrap_or_else ( || Url :: parse ( "http://example.com" ) . unwrap ( ) ) ,
396
512
headers : self . headers ,
397
513
body : self . body . freeze ( ) ,
514
+ local_socket : self . local_socket ,
515
+ remote_socket : self . remote_socket ,
398
516
}
399
517
}
400
518
}
0 commit comments