@@ -3,7 +3,6 @@ use async_std::sync;
3
3
4
4
use std:: convert:: TryInto ;
5
5
use std:: mem;
6
- use std:: net:: SocketAddr ;
7
6
use std:: pin:: Pin ;
8
7
use std:: task:: { Context , Poll } ;
9
8
@@ -37,8 +36,8 @@ pin_project_lite::pin_project! {
37
36
#[ pin]
38
37
body: Body ,
39
38
local: TypeMap ,
40
- local_addr: Option <SocketAddr >,
41
- peer_addr: Option <SocketAddr >,
39
+ local_addr: Option <String >,
40
+ peer_addr: Option <String >,
42
41
}
43
42
}
44
43
@@ -61,39 +60,34 @@ impl Request {
61
60
}
62
61
63
62
/// Get the peer socket address for the underlying transport, if appropriate
64
- pub fn peer_addr ( & self ) -> Option < SocketAddr > {
65
- self . peer_addr
63
+ pub fn peer_addr ( & self ) -> Option < & str > {
64
+ self . peer_addr . as_deref ( )
66
65
}
67
66
68
67
/// Get the local socket address for the underlying transport, if appropriate
69
- pub fn local_addr ( & self ) -> Option < SocketAddr > {
70
- self . local_addr
68
+ pub fn local_addr ( & self ) -> Option < & str > {
69
+ self . local_addr . as_deref ( )
71
70
}
72
71
73
72
/// Get the remote address for this request.
74
- pub fn remote ( & self ) -> Option < String > {
75
- self . forwarded_for ( )
76
- . or_else ( || self . peer_addr . map ( |peer| peer. to_string ( ) ) )
73
+ pub fn remote ( & self ) -> Option < & str > {
74
+ self . forwarded_for ( ) . or ( self . peer_addr ( ) )
77
75
}
78
76
79
77
/// Parses the Forwarded or X-Forwarded-For headers.
80
78
/// The returned String will either be an IP address or a domain and an optional port.
81
- pub fn forwarded_for ( & self ) -> Option < String > {
79
+ pub fn forwarded_for ( & self ) -> Option < & str > {
82
80
if let Some ( header) = self . header ( & "Forwarded" . parse ( ) . unwrap ( ) ) {
83
81
header. as_str ( ) . split ( ";" ) . find_map ( |key_equals_value| {
84
82
let parts = key_equals_value. split ( "=" ) . collect :: < Vec < _ > > ( ) ;
85
83
if parts. len ( ) == 2 && parts[ 0 ] . eq_ignore_ascii_case ( "for" ) {
86
- Some ( String :: from ( parts[ 1 ] ) )
84
+ Some ( parts[ 1 ] )
87
85
} else {
88
86
None
89
87
}
90
88
} )
91
89
} else if let Some ( header) = self . header ( & "X-Forwarded-For" . parse ( ) . unwrap ( ) ) {
92
- header
93
- . as_str ( )
94
- . split ( "," )
95
- . next ( )
96
- . map ( |client| String :: from ( client) )
90
+ header. as_str ( ) . split ( "," ) . next ( )
97
91
} else {
98
92
None
99
93
}
@@ -618,11 +612,8 @@ mod tests {
618
612
request. peer_addr = Some ( "127.0.0.1:8000" . parse ( ) . unwrap ( ) ) ;
619
613
set_forwarded ( & mut request, "127.0.0.1:8001" ) ;
620
614
621
- assert_eq ! (
622
- request. forwarded_for( ) ,
623
- Some ( String :: from( "127.0.0.1:8001" ) )
624
- ) ;
625
- assert_eq ! ( request. remote( ) , Some ( String :: from( "127.0.0.1:8001" ) ) ) ;
615
+ assert_eq ! ( request. forwarded_for( ) , Some ( "127.0.0.1:8001" ) ) ;
616
+ assert_eq ! ( request. remote( ) , Some ( "127.0.0.1:8001" ) ) ;
626
617
}
627
618
628
619
#[ test]
@@ -635,7 +626,7 @@ mod tests {
635
626
. unwrap ( ) ;
636
627
637
628
assert_eq ! ( request. forwarded_for( ) , None ) ;
638
- assert_eq ! ( request. remote( ) , Some ( String :: from ( "127.0.0.1:8000" ) ) ) ;
629
+ assert_eq ! ( request. remote( ) , Some ( "127.0.0.1:8000" ) ) ;
639
630
}
640
631
641
632
#[ test]
@@ -644,12 +635,8 @@ mod tests {
644
635
request. peer_addr = Some ( "127.0.0.1:8000" . parse ( ) . unwrap ( ) ) ;
645
636
set_x_forwarded_for ( & mut request, "forwarded-host.com" ) ;
646
637
647
- assert_eq ! (
648
- request. forwarded_for( ) ,
649
- Some ( String :: from( "forwarded-host.com" ) )
650
- ) ;
651
-
652
- assert_eq ! ( request. remote( ) , Some ( String :: from( "forwarded-host.com" ) ) ) ;
638
+ assert_eq ! ( request. forwarded_for( ) , Some ( "forwarded-host.com" ) ) ;
639
+ assert_eq ! ( request. remote( ) , Some ( "forwarded-host.com" ) ) ;
653
640
}
654
641
655
642
#[ test]
@@ -664,7 +651,7 @@ mod tests {
664
651
}
665
652
666
653
#[ test]
667
- fn test_remote_and_forwarded_for_falling_back_to_peer_addr ( ) {
654
+ fn test_remote_falling_back_to_peer_addr ( ) {
668
655
let mut request = build_test_request ( ) ;
669
656
request. peer_addr = Some ( "127.0.0.1:8000" . parse ( ) . unwrap ( ) ) ;
670
657
0 commit comments