@@ -18,6 +18,8 @@ pub enum Header {
18
18
TransferEncoding ,
19
19
/// Header `Server`.
20
20
Server ,
21
+ /// Header `Accept`
22
+ Accept ,
21
23
}
22
24
23
25
impl Header {
@@ -29,6 +31,7 @@ impl Header {
29
31
Self :: Expect => b"Expect" ,
30
32
Self :: TransferEncoding => b"Transfer-Encoding" ,
31
33
Self :: Server => b"Server" ,
34
+ Self :: Accept => b"Accept" ,
32
35
}
33
36
}
34
37
@@ -47,6 +50,7 @@ impl Header {
47
50
"expect" => Ok ( Self :: Expect ) ,
48
51
"transfer-encoding" => Ok ( Self :: TransferEncoding ) ,
49
52
"server" => Ok ( Self :: Server ) ,
53
+ "accept" => Ok ( Self :: Accept ) ,
50
54
_ => Err ( RequestError :: InvalidHeader ) ,
51
55
}
52
56
} else {
@@ -80,6 +84,9 @@ pub struct Headers {
80
84
/// server must support it. It is useful only when receiving the body of the request and should
81
85
/// be known immediately after parsing the headers.
82
86
chunked : bool ,
87
+ /// `Accept` header might be used by HTTP clients to enforce server responses with content
88
+ /// formatted in a specific way.
89
+ accept : MediaType ,
83
90
}
84
91
85
92
impl Default for Headers {
@@ -89,6 +96,9 @@ impl Default for Headers {
89
96
content_length : Default :: default ( ) ,
90
97
expect : Default :: default ( ) ,
91
98
chunked : Default :: default ( ) ,
99
+ // The default `Accept` media type is plain text. This is inclusive enough
100
+ // for structured and unstructured text.
101
+ accept : MediaType :: PlainText ,
92
102
}
93
103
}
94
104
}
@@ -137,6 +147,13 @@ impl Headers {
137
147
Err ( _) => Err ( RequestError :: UnsupportedHeader ) ,
138
148
}
139
149
}
150
+ Header :: Accept => match MediaType :: try_from ( entry[ 1 ] . trim ( ) . as_bytes ( ) ) {
151
+ Ok ( accept_type) => {
152
+ self . accept = accept_type;
153
+ Ok ( ( ) )
154
+ }
155
+ Err ( _) => Err ( RequestError :: UnsupportedHeader ) ,
156
+ } ,
140
157
Header :: TransferEncoding => match entry[ 1 ] . trim ( ) {
141
158
"chunked" => {
142
159
self . chunked = true ;
@@ -179,6 +196,11 @@ impl Headers {
179
196
self . expect
180
197
}
181
198
199
+ /// Returns the `Accept` header `MediaType`.
200
+ pub fn accept ( & self ) -> MediaType {
201
+ self . accept
202
+ }
203
+
182
204
/// Parses a byte slice into a Headers structure for a HTTP request.
183
205
///
184
206
/// The byte slice is expected to have the following format: </br>
@@ -219,6 +241,11 @@ impl Headers {
219
241
}
220
242
Err ( RequestError :: InvalidRequest )
221
243
}
244
+
245
+ /// Accept header setter.
246
+ pub fn set_accept ( & mut self , media_type : MediaType ) {
247
+ self . accept = media_type;
248
+ }
222
249
}
223
250
224
251
/// Wrapper over supported Media Types.
@@ -296,6 +323,7 @@ mod tests {
296
323
content_length,
297
324
expect,
298
325
chunked,
326
+ accept : MediaType :: PlainText ,
299
327
}
300
328
}
301
329
}
@@ -343,14 +371,27 @@ mod tests {
343
371
#[ test]
344
372
fn test_try_from_headers ( ) {
345
373
// Valid headers.
346
- assert_eq ! (
347
- Headers :: try_from(
348
- b"Last-Modified: Tue, 15 Nov 1994 12:45:26 GMT\r \n Content-Length: 55\r \n \r \n "
349
- )
350
- . unwrap( )
351
- . content_length,
352
- 55
353
- ) ;
374
+ let headers = Headers :: try_from (
375
+ b"Last-Modified: Tue, 15 Nov 1994 12:45:26 GMT\r \n Accept: application/json\r \n Content-Length: 55\r \n \r \n "
376
+ )
377
+ . unwrap ( ) ;
378
+ assert_eq ! ( headers. content_length, 55 ) ;
379
+ assert_eq ! ( headers. accept, MediaType :: ApplicationJson ) ;
380
+
381
+ // Valid headers.
382
+ let headers = Headers :: try_from (
383
+ b"Last-Modified: Tue, 15 Nov 1994 12:45:26 GMT\r \n Accept: text/plain\r \n Content-Length: 49\r \n \r \n "
384
+ )
385
+ . unwrap ( ) ;
386
+ assert_eq ! ( headers. content_length, 49 ) ;
387
+ assert_eq ! ( headers. accept, MediaType :: PlainText ) ;
388
+
389
+ // Valid headers.
390
+ let headers = Headers :: try_from (
391
+ b"Last-Modified: Tue, 15 Nov 1994 12:45:26 GMT\r \n Content-Length: 29\r \n \r \n " ,
392
+ )
393
+ . unwrap ( ) ;
394
+ assert_eq ! ( headers. content_length, 29 ) ;
354
395
355
396
// Valid headers.
356
397
assert_eq ! (
@@ -425,6 +466,19 @@ mod tests {
425
466
assert ! ( header
426
467
. parse_header_line( b"Content-Type: application/json" )
427
468
. is_ok( ) ) ;
469
+
470
+ // Test valid accept media type.
471
+ assert ! ( header
472
+ . parse_header_line( b"Accept: application/json" )
473
+ . is_ok( ) ) ;
474
+ assert ! ( header. accept == MediaType :: ApplicationJson ) ;
475
+ assert ! ( header. parse_header_line( b"Accept: text/plain" ) . is_ok( ) ) ;
476
+ assert ! ( header. accept == MediaType :: PlainText ) ;
477
+
478
+ // Test invalid accept media type.
479
+ assert ! ( header
480
+ . parse_header_line( b"Accept: application/json-patch" )
481
+ . is_err( ) ) ;
428
482
}
429
483
430
484
#[ test]
@@ -451,5 +505,8 @@ mod tests {
451
505
452
506
let header = Header :: try_from ( b"content-length" ) . unwrap ( ) ;
453
507
assert_eq ! ( header. raw( ) , b"Content-Length" ) ;
508
+
509
+ let header = Header :: try_from ( b"Accept" ) . unwrap ( ) ;
510
+ assert_eq ! ( header. raw( ) , b"Accept" ) ;
454
511
}
455
512
}
0 commit comments