@@ -2,7 +2,7 @@ use std::fmt::{self, Display, Formatter};
22use std:: str:: { from_utf8, FromStr } ;
33use std:: time:: { Duration , SystemTime , UNIX_EPOCH } ;
44
5- use http_types:: { Error , ErrorKind , StatusCode } ;
5+ use http_types:: { bail , ensure , format_err , Error } ;
66
77const IMF_FIXDATE_LENGTH : usize = 29 ;
88const RFC850_MAX_LENGTH : usize = 23 ;
@@ -66,10 +66,6 @@ impl HttpDate {
6666 }
6767}
6868
69- fn err ( msg : & ' static str ) -> Error {
70- Error :: from_str ( ErrorKind :: InvalidData , msg, StatusCode :: BadRequest )
71- }
72-
7369fn parse_imf_fixdate ( s : & [ u8 ] ) -> Result < HttpDate , Error > {
7470 // Example: `Sun, 06 Nov 1994 08:49:37 GMT`
7571 if s. len ( ) != IMF_FIXDATE_LENGTH
@@ -78,7 +74,7 @@ fn parse_imf_fixdate(s: &[u8]) -> Result<HttpDate, Error> {
7874 || s[ 19 ] != b':'
7975 || s[ 22 ] != b':'
8076 {
81- return Err ( err ( "Date time not in imf fixdate format" ) ) ;
77+ bail ! ( "Date time not in imf fixdate format" ) ;
8278 }
8379 Ok ( HttpDate {
8480 second : from_utf8 ( & s[ 23 ..25 ] ) ?. parse ( ) ?,
@@ -98,7 +94,7 @@ fn parse_imf_fixdate(s: &[u8]) -> Result<HttpDate, Error> {
9894 b" Oct " => 10 ,
9995 b" Nov " => 11 ,
10096 b" Dec " => 12 ,
101- _ => return Err ( err ( "Invalid Month" ) ) ,
97+ _ => bail ! ( "Invalid Month" ) ,
10298 } ,
10399 year : from_utf8 ( & s[ 12 ..16 ] ) ?. parse ( ) ?,
104100 week_day : match & s[ ..5 ] {
@@ -109,16 +105,17 @@ fn parse_imf_fixdate(s: &[u8]) -> Result<HttpDate, Error> {
109105 b"Fri, " => 5 ,
110106 b"Sat, " => 6 ,
111107 b"Sun, " => 7 ,
112- _ => return Err ( err ( "Invalid Day" ) ) ,
108+ _ => bail ! ( "Invalid Day" ) ,
113109 } ,
114110 } )
115111}
116112
117113fn parse_rfc850_date ( s : & [ u8 ] ) -> Result < HttpDate , Error > {
118114 // Example: `Sunday, 06-Nov-94 08:49:37 GMT`
119- if s. len ( ) < RFC850_MAX_LENGTH {
120- return Err ( err ( "Date time not in rfc850 format" ) ) ;
121- }
115+ ensure ! (
116+ s. len( ) < RFC850_MAX_LENGTH ,
117+ "Date time not in rfc850 format"
118+ ) ;
122119
123120 fn week_day < ' a > ( s : & ' a [ u8 ] , week_day : u8 , name : & ' static [ u8 ] ) -> Option < ( u8 , & ' a [ u8 ] ) > {
124121 if & s[ 0 ..name. len ( ) ] == name {
@@ -133,9 +130,9 @@ fn parse_rfc850_date(s: &[u8]) -> Result<HttpDate, Error> {
133130 . or_else ( || week_day ( s, 5 , b"Friday, " ) )
134131 . or_else ( || week_day ( s, 6 , b"Saturday, " ) )
135132 . or_else ( || week_day ( s, 7 , b"Sunday, " ) )
136- . ok_or_else ( || err ( "Invalid day" ) ) ?;
133+ . ok_or_else ( || format_err ! ( "Invalid day" ) ) ?;
137134 if s. len ( ) != 22 || s[ 12 ] != b':' || s[ 15 ] != b':' || & s[ 18 ..22 ] != b" GMT" {
138- return Err ( err ( "Date time not in rfc850 format" ) ) ;
135+ bail ! ( "Date time not in rfc950 fmt" ) ;
139136 }
140137 let mut year = from_utf8 ( & s[ 7 ..9 ] ) ?. parse :: < u16 > ( ) ?;
141138 if year < 70 {
@@ -161,7 +158,7 @@ fn parse_rfc850_date(s: &[u8]) -> Result<HttpDate, Error> {
161158 b"-Oct-" => 10 ,
162159 b"-Nov-" => 11 ,
163160 b"-Dec-" => 12 ,
164- _ => return Err ( err ( "Invalid month" ) ) ,
161+ _ => bail ! ( "Invalid month" ) ,
165162 } ,
166163 year : year,
167164 week_day : week_day,
@@ -172,7 +169,7 @@ fn parse_asctime(s: &[u8]) -> Result<HttpDate, Error> {
172169 // Example: `Sun Nov 6 08:49:37 1994`
173170 if s. len ( ) != ASCTIME_LENGTH || s[ 10 ] != b' ' || s[ 13 ] != b':' || s[ 16 ] != b':' || s[ 19 ] != b' '
174171 {
175- return Err ( err ( "Date time not in asctime format" ) ) ;
172+ bail ! ( "Date time not in asctime format" ) ;
176173 }
177174 Ok ( HttpDate {
178175 second : from_utf8 ( & s[ 17 ..19 ] ) ?. parse ( ) ?,
@@ -195,7 +192,7 @@ fn parse_asctime(s: &[u8]) -> Result<HttpDate, Error> {
195192 b"Oct " => 10 ,
196193 b"Nov " => 11 ,
197194 b"Dec " => 12 ,
198- _ => return Err ( err ( "Invalid month" ) ) ,
195+ _ => bail ! ( "Invalid month" ) ,
199196 } ,
200197 year : from_utf8 ( & s[ 20 ..24 ] ) ?. parse ( ) ?,
201198 week_day : match & s[ 0 ..4 ] {
@@ -206,7 +203,7 @@ fn parse_asctime(s: &[u8]) -> Result<HttpDate, Error> {
206203 b"Fri " => 5 ,
207204 b"Sat " => 6 ,
208205 b"Sun " => 7 ,
209- _ => return Err ( err ( "Invalid day" ) ) ,
206+ _ => bail ! ( "Invalid day" ) ,
210207 } ,
211208 } )
212209}
@@ -332,16 +329,12 @@ impl FromStr for HttpDate {
332329 type Err = Error ;
333330
334331 fn from_str ( s : & str ) -> Result < Self , Self :: Err > {
335- if !s. is_ascii ( ) {
336- return Err ( err ( "Not ascii" ) ) ;
337- }
332+ ensure ! ( s. is_ascii( ) , "String slice is not valid ASCII" ) ;
338333 let x = s. trim ( ) . as_bytes ( ) ;
339334 let date = parse_imf_fixdate ( x)
340335 . or_else ( |_| parse_rfc850_date ( x) )
341336 . or_else ( |_| parse_asctime ( x) ) ?;
342- if !date. is_valid ( ) {
343- return Err ( err ( "Invalid date time" ) ) ;
344- }
337+ ensure ! ( date. is_valid( ) , "Invalid date time" ) ;
345338 Ok ( date)
346339 }
347340}
0 commit comments