@@ -21,8 +21,8 @@ pub struct Forwarded<'a> {
21
21
22
22
impl < ' a > Forwarded < ' a > {
23
23
/// Attempts to parse a Forwarded from headers (or a request or
24
- /// response). Builds a reference by default. To
25
- /// build a Forwarded with a 'static lifetime , use
24
+ /// response). Builds a borrowed Forwarded by default. To build an
25
+ /// owned Forwarded, use
26
26
/// `Forwarded::from_headers(...).into_owned()`
27
27
///
28
28
/// # X-Forwarded-For, -By, and -Proto compatability
@@ -42,25 +42,29 @@ impl<'a> Forwarded<'a> {
42
42
///
43
43
/// # Examples
44
44
/// ```rust
45
- /// # use http_types::{proxies::Forwarded, Method::Get, Request, Url};
46
- /// let mut request = Request::new(Get, Url::parse("http://_/").unwrap());
45
+ /// # use http_types::{proxies::Forwarded, Method::Get, Request, Url, Result};
46
+ /// # fn main() -> Result<()> {
47
+ /// let mut request = Request::new(Get, Url::parse("http://_/")?);
47
48
/// request.insert_header(
48
49
/// "Forwarded",
49
50
/// r#"for=192.0.2.43, for="[2001:db8:cafe::17]", for=unknown;proto=https"#
50
51
/// );
51
- /// let forwarded = Forwarded::from_headers(&request).unwrap() .unwrap();
52
+ /// let forwarded = Forwarded::from_headers(&request)? .unwrap();
52
53
/// assert_eq!(forwarded.proto(), Some("https"));
53
54
/// assert_eq!(forwarded.forwarded_for(), vec!["192.0.2.43", "[2001:db8:cafe::17]", "unknown"]);
55
+ /// # Ok(()) }
54
56
/// ```
55
57
///
56
58
/// ```rust
57
- /// # use http_types::{proxies::Forwarded, Method::Get, Request, Url};
58
- /// let mut request = Request::new(Get, Url::parse("http://_/").unwrap());
59
+ /// # use http_types::{proxies::Forwarded, Method::Get, Request, Url, Result};
60
+ /// # fn main() -> Result<()> {
61
+ /// let mut request = Request::new(Get, Url::parse("http://_/")?);
59
62
/// request.insert_header("X-Forwarded-For", "192.0.2.43, 2001:db8:cafe::17");
60
63
/// request.insert_header("X-Forwarded-Proto", "https");
61
- /// let forwarded = Forwarded::from_headers(&request).unwrap() .unwrap();
64
+ /// let forwarded = Forwarded::from_headers(&request)? .unwrap();
62
65
/// assert_eq!(forwarded.forwarded_for(), vec!["192.0.2.43", "[2001:db8:cafe::17]"]);
63
66
/// assert_eq!(forwarded.proto(), Some("https"));
67
+ /// # Ok(()) }
64
68
/// ```
65
69
66
70
pub fn from_headers ( headers : & ' a impl AsRef < Headers > ) -> Result < Option < Self > , ParseError > {
@@ -75,21 +79,25 @@ impl<'a> Forwarded<'a> {
75
79
///
76
80
/// # Examples
77
81
/// ```rust
78
- /// # use http_types::{proxies::Forwarded, Method::Get, Request, Url};
79
- /// let mut request = Request::new(Get, Url::parse("http://_/").unwrap());
82
+ /// # use http_types::{proxies::Forwarded, Method::Get, Request, Url, Result};
83
+ /// # fn main() -> Result<()> {
84
+ /// let mut request = Request::new(Get, Url::parse("http://_/")?);
80
85
/// request.insert_header(
81
86
/// "Forwarded",
82
87
/// r#"for=192.0.2.43, for="[2001:db8:cafe::17]", for=unknown;proto=https"#
83
88
/// );
84
- /// let forwarded = Forwarded::from_forwarded_header(&request).unwrap() .unwrap();
89
+ /// let forwarded = Forwarded::from_forwarded_header(&request)? .unwrap();
85
90
/// assert_eq!(forwarded.proto(), Some("https"));
86
91
/// assert_eq!(forwarded.forwarded_for(), vec!["192.0.2.43", "[2001:db8:cafe::17]", "unknown"]);
92
+ /// # Ok(()) }
87
93
/// ```
88
94
/// ```rust
89
- /// # use http_types::{proxies::Forwarded, Method::Get, Request, Url};
90
- /// let mut request = Request::new(Get, Url::parse("http://_/").unwrap());
95
+ /// # use http_types::{proxies::Forwarded, Method::Get, Request, Url, Result};
96
+ /// # fn main() -> Result<()> {
97
+ /// let mut request = Request::new(Get, Url::parse("http://_/")?);
91
98
/// request.insert_header("X-Forwarded-For", "192.0.2.43, 2001:db8:cafe::17");
92
- /// assert!(Forwarded::from_forwarded_header(&request).unwrap().is_none())
99
+ /// assert!(Forwarded::from_forwarded_header(&request)?.is_none());
100
+ /// # Ok(()) }
93
101
/// ```
94
102
pub fn from_forwarded_header (
95
103
headers : & ' a impl AsRef < Headers > ,
@@ -107,20 +115,24 @@ impl<'a> Forwarded<'a> {
107
115
///
108
116
/// # Examples
109
117
/// ```rust
110
- /// # use http_types::{proxies::Forwarded, Method::Get, Request, Url};
111
- /// let mut request = Request::new(Get, Url::parse("http://_/").unwrap());
118
+ /// # use http_types::{proxies::Forwarded, Method::Get, Request, Url, Result};
119
+ /// # fn main() -> Result<()> {
120
+ /// let mut request = Request::new(Get, Url::parse("http://_/")?);
112
121
/// request.insert_header("X-Forwarded-For", "192.0.2.43, 2001:db8:cafe::17");
113
- /// let forwarded = Forwarded::from_headers(&request).unwrap() .unwrap();
122
+ /// let forwarded = Forwarded::from_headers(&request)? .unwrap();
114
123
/// assert_eq!(forwarded.forwarded_for(), vec!["192.0.2.43", "[2001:db8:cafe::17]"]);
124
+ /// # Ok(()) }
115
125
/// ```
116
126
/// ```rust
117
- /// # use http_types::{proxies::Forwarded, Method::Get, Request, Url};
118
- /// let mut request = Request::new(Get, Url::parse("http://_/").unwrap());
127
+ /// # use http_types::{proxies::Forwarded, Method::Get, Request, Url, Result};
128
+ /// # fn main() -> Result<()> {
129
+ /// let mut request = Request::new(Get, Url::parse("http://_/")?);
119
130
/// request.insert_header(
120
131
/// "Forwarded",
121
132
/// r#"for=192.0.2.43, for="[2001:db8:cafe::17]", for=unknown;proto=https"#
122
133
/// );
123
- /// assert!(Forwarded::from_x_headers(&request).unwrap().is_none());
134
+ /// assert!(Forwarded::from_x_headers(&request)?.is_none());
135
+ /// # Ok(()) }
124
136
/// ```
125
137
pub fn from_x_headers ( headers : & ' a impl AsRef < Headers > ) -> Result < Option < Self > , ParseError > {
126
138
let headers = headers. as_ref ( ) ;
@@ -456,52 +468,41 @@ impl<'a> TryFrom<&'a str> for Forwarded<'a> {
456
468
#[ cfg( test) ]
457
469
mod tests {
458
470
use super :: * ;
459
- use crate :: { Method :: Get , Request , Response } ;
471
+ use crate :: { Method :: Get , Request , Response , Result } ;
460
472
use url:: Url ;
461
473
462
474
#[ test]
463
- fn parsing_for ( ) -> crate :: Result < ( ) > {
475
+ fn parsing_for ( ) -> Result < ( ) > {
464
476
assert_eq ! (
465
- Forwarded :: parse( r#"for="_gazonk""# )
466
- . unwrap( )
467
- . forwarded_for( ) ,
477
+ Forwarded :: parse( r#"for="_gazonk""# ) ?. forwarded_for( ) ,
468
478
vec![ "_gazonk" ]
469
479
) ;
470
480
assert_eq ! (
471
- Forwarded :: parse( r#"For="[2001:db8:cafe::17]:4711""# )
472
- . unwrap( )
473
- . forwarded_for( ) ,
481
+ Forwarded :: parse( r#"For="[2001:db8:cafe::17]:4711""# ) ?. forwarded_for( ) ,
474
482
vec![ "[2001:db8:cafe::17]:4711" ]
475
483
) ;
476
484
477
485
assert_eq ! (
478
- Forwarded :: parse( "for=192.0.2.60;proto=http;by=203.0.113.43" )
479
- . unwrap( )
480
- . forwarded_for( ) ,
486
+ Forwarded :: parse( "for=192.0.2.60;proto=http;by=203.0.113.43" ) ?. forwarded_for( ) ,
481
487
vec![ "192.0.2.60" ]
482
488
) ;
483
489
484
490
assert_eq ! (
485
- Forwarded :: parse( "for=192.0.2.43, for=198.51.100.17" )
486
- . unwrap( )
487
- . forwarded_for( ) ,
491
+ Forwarded :: parse( "for=192.0.2.43, for=198.51.100.17" ) ?. forwarded_for( ) ,
488
492
vec![ "192.0.2.43" , "198.51.100.17" ]
489
493
) ;
490
494
491
495
assert_eq ! (
492
- Forwarded :: parse( r#"for=192.0.2.43,for="[2001:db8:cafe::17]",for=unknown"# )
493
- . unwrap( )
496
+ Forwarded :: parse( r#"for=192.0.2.43,for="[2001:db8:cafe::17]",for=unknown"# ) ?
494
497
. forwarded_for( ) ,
495
- Forwarded :: parse( r#"for=192.0.2.43, for="[2001:db8:cafe::17]", for=unknown"# )
496
- . unwrap( )
498
+ Forwarded :: parse( r#"for=192.0.2.43, for="[2001:db8:cafe::17]", for=unknown"# ) ?
497
499
. forwarded_for( )
498
500
) ;
499
501
500
502
assert_eq ! (
501
503
Forwarded :: parse(
502
504
r#"for=192.0.2.43,for="this is a valid quoted-string, \" \\",for=unknown"#
503
- )
504
- . unwrap( )
505
+ ) ?
505
506
. forwarded_for( ) ,
506
507
vec![
507
508
"192.0.2.43" ,
@@ -514,25 +515,19 @@ mod tests {
514
515
}
515
516
516
517
#[ test]
517
- fn formatting_for ( ) -> crate :: Result < ( ) > {
518
- assert_eq ! ( "" , Forwarded :: new( ) . to_string( ) ) ;
519
- Ok ( ( ) )
520
- }
521
-
522
- #[ test]
523
- fn basic_parse ( ) {
524
- let forwarded =
525
- Forwarded :: parse ( "for=client.com;by=proxy.com;host=host.com;proto=https" ) . unwrap ( ) ;
518
+ fn basic_parse ( ) -> Result < ( ) > {
519
+ let forwarded = Forwarded :: parse ( "for=client.com;by=proxy.com;host=host.com;proto=https" ) ?;
526
520
527
521
assert_eq ! ( forwarded. by( ) , Some ( "proxy.com" ) ) ;
528
522
assert_eq ! ( forwarded. forwarded_for( ) , vec![ "client.com" ] ) ;
529
523
assert_eq ! ( forwarded. host( ) , Some ( "host.com" ) ) ;
530
524
assert_eq ! ( forwarded. proto( ) , Some ( "https" ) ) ;
531
525
assert ! ( matches!( forwarded, Forwarded { ..} ) ) ;
526
+ Ok ( ( ) )
532
527
}
533
528
534
529
#[ test]
535
- fn bad_parse ( ) {
530
+ fn bad_parse ( ) -> Result < ( ) > {
536
531
let err = Forwarded :: parse ( "by=proxy.com;for=client;host=example.com;host" ) . unwrap_err ( ) ;
537
532
assert_eq ! (
538
533
err. to_string( ) ,
@@ -562,10 +557,11 @@ mod tests {
562
557
err. to_string( ) ,
563
558
"unable to parse forwarded header: for= without valid value"
564
559
) ;
560
+ Ok ( ( ) )
565
561
}
566
562
567
563
#[ test]
568
- fn bad_parse_from_headers ( ) {
564
+ fn bad_parse_from_headers ( ) -> Result < ( ) > {
569
565
let mut response = Response :: new ( 200 ) ;
570
566
response. append_header ( "forwarded" , "uh oh" ) ;
571
567
assert_eq ! (
@@ -574,72 +570,76 @@ mod tests {
574
570
) ;
575
571
576
572
let response = Response :: new ( 200 ) ;
577
- assert ! ( Forwarded :: from_headers( & response) . unwrap( ) . is_none( ) ) ;
573
+ assert ! ( Forwarded :: from_headers( & response) ?. is_none( ) ) ;
574
+ Ok ( ( ) )
578
575
}
579
576
580
577
#[ test]
581
- fn from_x_headers ( ) {
582
- let mut request = Request :: new ( Get , Url :: parse ( "http://_/" ) . unwrap ( ) ) ;
578
+ fn from_x_headers ( ) -> Result < ( ) > {
579
+ let mut request = Request :: new ( Get , Url :: parse ( "http://_/" ) ? ) ;
583
580
request. append_header ( X_FORWARDED_FOR , "192.0.2.43, 2001:db8:cafe::17" ) ;
584
581
request. append_header ( X_FORWARDED_PROTO , "gopher" ) ;
585
- let forwarded = Forwarded :: from_headers ( & request) . unwrap ( ) . unwrap ( ) ;
582
+ let forwarded = Forwarded :: from_headers ( & request) ? . unwrap ( ) ;
586
583
assert_eq ! (
587
584
forwarded. to_string( ) ,
588
585
r#"for=192.0.2.43, for="[2001:db8:cafe::17]";proto=gopher"#
589
586
) ;
587
+ Ok ( ( ) )
590
588
}
591
589
592
590
#[ test]
593
- fn formatting_edge_cases ( ) {
591
+ fn formatting_edge_cases ( ) -> Result < ( ) > {
594
592
let forwarded = Forwarded :: new ( )
595
593
. with_for ( r#"quote: " backslash: \"# . into ( ) )
596
594
. with_for ( ";proto=https" . into ( ) ) ;
597
595
assert_eq ! (
598
596
forwarded. to_string( ) ,
599
597
r#"for="quote: \" backslash: \\", for=";proto=https""#
600
598
) ;
599
+ Ok ( ( ) )
601
600
}
602
601
603
602
#[ test]
604
- fn parse_edge_cases ( ) {
603
+ fn parse_edge_cases ( ) -> Result < ( ) > {
605
604
let forwarded =
606
- Forwarded :: parse ( r#"for=";", for=",", for="\"", for=unquoted;by=";proto=https""# )
607
- . unwrap ( ) ;
605
+ Forwarded :: parse ( r#"for=";", for=",", for="\"", for=unquoted;by=";proto=https""# ) ?;
608
606
assert_eq ! ( forwarded. forwarded_for( ) , vec![ ";" , "," , "\" " , "unquoted" ] ) ;
609
607
assert_eq ! ( forwarded. by( ) , Some ( ";proto=https" ) ) ;
610
608
assert ! ( forwarded. proto( ) . is_none( ) ) ;
611
609
612
- let forwarded = Forwarded :: parse ( "proto=https" ) . unwrap ( ) ;
610
+ let forwarded = Forwarded :: parse ( "proto=https" ) ? ;
613
611
assert_eq ! ( forwarded. proto( ) , Some ( "https" ) ) ;
612
+ Ok ( ( ) )
614
613
}
615
614
616
615
#[ test]
617
- fn owned_parse ( ) {
618
- let forwarded = Forwarded :: parse ( "for=client;by=proxy.com;host=example.com;proto=https" )
619
- . unwrap ( )
620
- . into_owned ( ) ;
616
+ fn owned_parse ( ) -> Result < ( ) > {
617
+ let forwarded =
618
+ Forwarded :: parse ( "for=client;by=proxy.com;host=example.com;proto=https" ) ?. into_owned ( ) ;
621
619
622
620
assert_eq ! ( forwarded. by( ) , Some ( "proxy.com" ) ) ;
623
621
assert_eq ! ( forwarded. forwarded_for( ) , vec![ "client" ] ) ;
624
622
assert_eq ! ( forwarded. host( ) , Some ( "example.com" ) ) ;
625
623
assert_eq ! ( forwarded. proto( ) , Some ( "https" ) ) ;
626
624
assert ! ( matches!( forwarded, Forwarded { ..} ) ) ;
625
+ Ok ( ( ) )
627
626
}
628
627
629
628
#[ test]
630
- fn from_request ( ) -> crate :: Result < ( ) > {
631
- let mut request = Request :: new ( Get , Url :: parse ( "http://_/" ) . unwrap ( ) ) ;
629
+ fn from_request ( ) -> Result < ( ) > {
630
+ let mut request = Request :: new ( Get , Url :: parse ( "http://_/" ) ? ) ;
632
631
request. append_header ( "Forwarded" , "for=for" ) ;
633
632
634
633
let forwarded = Forwarded :: from_headers ( & request) ?. unwrap ( ) ;
635
634
assert_eq ! ( forwarded. forwarded_for( ) , vec![ "for" ] ) ;
635
+
636
636
Ok ( ( ) )
637
637
}
638
638
639
639
#[ test]
640
- fn owned_can_outlive_request ( ) -> crate :: Result < ( ) > {
640
+ fn owned_can_outlive_request ( ) -> Result < ( ) > {
641
641
let forwarded = {
642
- let mut request = Request :: new ( Get , Url :: parse ( "http://_/" ) . unwrap ( ) ) ;
642
+ let mut request = Request :: new ( Get , Url :: parse ( "http://_/" ) ? ) ;
643
643
request. append_header ( "Forwarded" , "for=for;by=by;host=host;proto=proto" ) ;
644
644
Forwarded :: from_headers ( & request) ?. unwrap ( ) . into_owned ( )
645
645
} ;
0 commit comments