1
1
use std:: collections:: { hash_map:: Entry , HashMap } ;
2
2
3
3
/// Represents a single HTTP header value or multiple values for the same header.
4
- #[ derive( Debug , Clone ) ]
4
+ #[ derive( Debug , Clone , Eq , PartialEq , Hash ) ]
5
5
pub enum Header {
6
6
/// A single value for a header.
7
7
Single ( String ) ,
@@ -62,9 +62,7 @@ impl Headers {
62
62
where
63
63
K : AsRef < str > ,
64
64
{
65
- self
66
- . 0
67
- . contains_key ( key. as_ref ( ) /*.to_lowercase().as_str()*/ )
65
+ self . 0 . contains_key ( key. as_ref ( ) . to_lowercase ( ) . as_str ( ) )
68
66
}
69
67
70
68
/// Returns the last single value associated with a header field.
@@ -83,7 +81,7 @@ impl Headers {
83
81
where
84
82
K : AsRef < str > ,
85
83
{
86
- match self . 0 . get ( key. as_ref ( ) /* .to_lowercase().as_str()*/ ) {
84
+ match self . 0 . get ( key. as_ref ( ) . to_lowercase ( ) . as_str ( ) ) {
87
85
Some ( Header :: Single ( value) ) => Some ( value. clone ( ) ) ,
88
86
Some ( Header :: Multiple ( values) ) => values. last ( ) . cloned ( ) ,
89
87
None => None ,
@@ -112,7 +110,7 @@ impl Headers {
112
110
where
113
111
K : AsRef < str > ,
114
112
{
115
- match self . 0 . get ( key. as_ref ( ) /* .to_lowercase().as_str()*/ ) {
113
+ match self . 0 . get ( key. as_ref ( ) . to_lowercase ( ) . as_str ( ) ) {
116
114
Some ( Header :: Single ( value) ) => vec ! [ value. clone( ) ] ,
117
115
Some ( Header :: Multiple ( values) ) => values. clone ( ) ,
118
116
None => Vec :: new ( ) ,
@@ -143,12 +141,10 @@ impl Headers {
143
141
where
144
142
K : AsRef < str > ,
145
143
{
146
- let result = self . get_all ( key) . join ( "," ) ;
147
- if result. is_empty ( ) {
148
- None
149
- } else {
150
- Some ( result)
151
- }
144
+ self
145
+ . 0
146
+ . get ( key. as_ref ( ) . to_lowercase ( ) . as_str ( ) )
147
+ . map ( |v| v. into ( ) )
152
148
}
153
149
154
150
/// Sets a header field, replacing any existing values.
@@ -168,10 +164,9 @@ impl Headers {
168
164
K : Into < String > ,
169
165
V : Into < String > ,
170
166
{
171
- self . 0 . insert (
172
- key. into ( ) , /*.to_lowercase()*/
173
- Header :: Single ( value. into ( ) ) ,
174
- ) ;
167
+ self
168
+ . 0
169
+ . insert ( key. into ( ) . to_lowercase ( ) , Header :: Single ( value. into ( ) ) ) ;
175
170
}
176
171
177
172
/// Add a header with the given value without replacing existing ones.
@@ -194,7 +189,7 @@ impl Headers {
194
189
K : Into < String > ,
195
190
V : Into < String > ,
196
191
{
197
- let key = key. into ( ) /* .to_lowercase()*/ ;
192
+ let key = key. into ( ) . to_lowercase ( ) ;
198
193
let value = value. into ( ) ;
199
194
200
195
match self . 0 . entry ( key) {
@@ -234,7 +229,7 @@ impl Headers {
234
229
where
235
230
K : AsRef < str > ,
236
231
{
237
- self . 0 . remove ( key. as_ref ( ) /* .to_lowercase().as_str()*/ ) ;
232
+ self . 0 . remove ( key. as_ref ( ) . to_lowercase ( ) . as_str ( ) ) ;
238
233
}
239
234
240
235
/// Clears all headers.
@@ -292,14 +287,21 @@ impl Headers {
292
287
/// # Examples
293
288
///
294
289
/// ```
295
- /// # use lang_handler::Headers;
290
+ /// # use lang_handler::{ Headers, Header} ;
296
291
/// let mut headers = Headers::new();
297
- /// headers.set ("Accept", "text/plain");
298
- /// headers.set ("Accept", "application/json");
292
+ /// headers.add ("Accept", "text/plain");
293
+ /// headers.add ("Accept", "application/json");
299
294
///
300
295
/// for (key, values) in headers.iter() {
301
296
/// println!("{}: {:?}", key, values);
302
297
/// }
298
+ ///
299
+ /// # assert_eq!(headers.iter().collect::<Vec<(&String, &Header)>>(), vec![
300
+ /// # (&"accept".to_string(), &Header::Multiple(vec![
301
+ /// # "text/plain".to_string(),
302
+ /// # "application/json".to_string()
303
+ /// # ]))
304
+ /// # ]);
303
305
/// ```
304
306
pub fn iter ( & self ) -> impl Iterator < Item = ( & String , & Header ) > {
305
307
self . 0 . iter ( )
0 commit comments