@@ -2,7 +2,7 @@ use std::fmt::{self, Display, Formatter};
2
2
use std:: str:: { from_utf8, FromStr } ;
3
3
use std:: time:: { Duration , SystemTime , UNIX_EPOCH } ;
4
4
5
- use http_types:: { Error , ErrorKind , StatusCode } ;
5
+ use http_types:: { bail , ensure , format_err , Error } ;
6
6
7
7
const IMF_FIXDATE_LENGTH : usize = 29 ;
8
8
const RFC850_MAX_LENGTH : usize = 23 ;
@@ -66,10 +66,6 @@ impl HttpDate {
66
66
}
67
67
}
68
68
69
- fn err ( msg : & ' static str ) -> Error {
70
- Error :: from_str ( ErrorKind :: InvalidData , msg, StatusCode :: BadRequest )
71
- }
72
-
73
69
fn parse_imf_fixdate ( s : & [ u8 ] ) -> Result < HttpDate , Error > {
74
70
// Example: `Sun, 06 Nov 1994 08:49:37 GMT`
75
71
if s. len ( ) != IMF_FIXDATE_LENGTH
@@ -78,7 +74,7 @@ fn parse_imf_fixdate(s: &[u8]) -> Result<HttpDate, Error> {
78
74
|| s[ 19 ] != b':'
79
75
|| s[ 22 ] != b':'
80
76
{
81
- return Err ( err ( "Date time not in imf fixdate format" ) ) ;
77
+ bail ! ( "Date time not in imf fixdate format" ) ;
82
78
}
83
79
Ok ( HttpDate {
84
80
second : from_utf8 ( & s[ 23 ..25 ] ) ?. parse ( ) ?,
@@ -98,7 +94,7 @@ fn parse_imf_fixdate(s: &[u8]) -> Result<HttpDate, Error> {
98
94
b" Oct " => 10 ,
99
95
b" Nov " => 11 ,
100
96
b" Dec " => 12 ,
101
- _ => return Err ( err ( "Invalid Month" ) ) ,
97
+ _ => bail ! ( "Invalid Month" ) ,
102
98
} ,
103
99
year : from_utf8 ( & s[ 12 ..16 ] ) ?. parse ( ) ?,
104
100
week_day : match & s[ ..5 ] {
@@ -109,16 +105,17 @@ fn parse_imf_fixdate(s: &[u8]) -> Result<HttpDate, Error> {
109
105
b"Fri, " => 5 ,
110
106
b"Sat, " => 6 ,
111
107
b"Sun, " => 7 ,
112
- _ => return Err ( err ( "Invalid Day" ) ) ,
108
+ _ => bail ! ( "Invalid Day" ) ,
113
109
} ,
114
110
} )
115
111
}
116
112
117
113
fn parse_rfc850_date ( s : & [ u8 ] ) -> Result < HttpDate , Error > {
118
114
// 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
+ ) ;
122
119
123
120
fn week_day < ' a > ( s : & ' a [ u8 ] , week_day : u8 , name : & ' static [ u8 ] ) -> Option < ( u8 , & ' a [ u8 ] ) > {
124
121
if & s[ 0 ..name. len ( ) ] == name {
@@ -133,9 +130,9 @@ fn parse_rfc850_date(s: &[u8]) -> Result<HttpDate, Error> {
133
130
. or_else ( || week_day ( s, 5 , b"Friday, " ) )
134
131
. or_else ( || week_day ( s, 6 , b"Saturday, " ) )
135
132
. or_else ( || week_day ( s, 7 , b"Sunday, " ) )
136
- . ok_or_else ( || err ( "Invalid day" ) ) ?;
133
+ . ok_or_else ( || format_err ! ( "Invalid day" ) ) ?;
137
134
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" ) ;
139
136
}
140
137
let mut year = from_utf8 ( & s[ 7 ..9 ] ) ?. parse :: < u16 > ( ) ?;
141
138
if year < 70 {
@@ -161,7 +158,7 @@ fn parse_rfc850_date(s: &[u8]) -> Result<HttpDate, Error> {
161
158
b"-Oct-" => 10 ,
162
159
b"-Nov-" => 11 ,
163
160
b"-Dec-" => 12 ,
164
- _ => return Err ( err ( "Invalid month" ) ) ,
161
+ _ => bail ! ( "Invalid month" ) ,
165
162
} ,
166
163
year : year,
167
164
week_day : week_day,
@@ -172,7 +169,7 @@ fn parse_asctime(s: &[u8]) -> Result<HttpDate, Error> {
172
169
// Example: `Sun Nov 6 08:49:37 1994`
173
170
if s. len ( ) != ASCTIME_LENGTH || s[ 10 ] != b' ' || s[ 13 ] != b':' || s[ 16 ] != b':' || s[ 19 ] != b' '
174
171
{
175
- return Err ( err ( "Date time not in asctime format" ) ) ;
172
+ bail ! ( "Date time not in asctime format" ) ;
176
173
}
177
174
Ok ( HttpDate {
178
175
second : from_utf8 ( & s[ 17 ..19 ] ) ?. parse ( ) ?,
@@ -195,7 +192,7 @@ fn parse_asctime(s: &[u8]) -> Result<HttpDate, Error> {
195
192
b"Oct " => 10 ,
196
193
b"Nov " => 11 ,
197
194
b"Dec " => 12 ,
198
- _ => return Err ( err ( "Invalid month" ) ) ,
195
+ _ => bail ! ( "Invalid month" ) ,
199
196
} ,
200
197
year : from_utf8 ( & s[ 20 ..24 ] ) ?. parse ( ) ?,
201
198
week_day : match & s[ 0 ..4 ] {
@@ -206,7 +203,7 @@ fn parse_asctime(s: &[u8]) -> Result<HttpDate, Error> {
206
203
b"Fri " => 5 ,
207
204
b"Sat " => 6 ,
208
205
b"Sun " => 7 ,
209
- _ => return Err ( err ( "Invalid day" ) ) ,
206
+ _ => bail ! ( "Invalid day" ) ,
210
207
} ,
211
208
} )
212
209
}
@@ -332,16 +329,12 @@ impl FromStr for HttpDate {
332
329
type Err = Error ;
333
330
334
331
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" ) ;
338
333
let x = s. trim ( ) . as_bytes ( ) ;
339
334
let date = parse_imf_fixdate ( x)
340
335
. or_else ( |_| parse_rfc850_date ( x) )
341
336
. 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" ) ;
345
338
Ok ( date)
346
339
}
347
340
}
0 commit comments