|
1 | 1 | //! The `content_negotiation` module deals with handling media types, languages, charsets and
|
2 | 2 | //! encodings as per https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html.
|
3 | 3 |
|
4 |
| -use itertools::Itertools; |
5 | 4 | use std::cmp::Ordering;
|
6 |
| -use crate::headers::HeaderValue; |
| 5 | + |
| 6 | +use itertools::Itertools; |
| 7 | + |
| 8 | +use crate::Resource; |
7 | 9 | use crate::context::WebmachineRequest;
|
8 |
| -use crate::WebmachineResource; |
| 10 | +use crate::headers::HeaderValue; |
9 | 11 |
|
10 | 12 | /// Enum to represent a match with media types
|
11 | 13 | #[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord)]
|
@@ -116,22 +118,22 @@ pub fn sort_media_types(media_types: &Vec<HeaderValue>) -> Vec<HeaderValue> {
|
116 | 118 |
|
117 | 119 | /// Determines if the media types produced by the resource matches the acceptable media types
|
118 | 120 | /// provided by the client. Returns the match if there is one.
|
119 |
| -pub fn matching_content_type(resource: &WebmachineResource, request: &WebmachineRequest) -> Option<String> { |
| 121 | +pub fn matching_content_type(resource: &(dyn Resource + Send + Sync), request: &WebmachineRequest) -> Option<String> { |
120 | 122 | if request.has_accept_header() {
|
121 | 123 | let acceptable_media_types = sort_media_types(&request.accept());
|
122 |
| - resource.produces.iter() |
123 |
| - .cloned() |
| 124 | + resource.produces().iter() |
124 | 125 | .cartesian_product(acceptable_media_types.iter())
|
125 | 126 | .map(|(produced, acceptable)| {
|
126 | 127 | let acceptable_media_type = acceptable.as_media_type();
|
127 |
| - let produced_media_type = MediaType::parse_string(produced.as_str()); |
| 128 | + let produced_media_type = MediaType::parse_string(produced); |
128 | 129 | (produced_media_type.clone(), acceptable_media_type.clone(), produced_media_type.matches(&acceptable_media_type))
|
129 | 130 | })
|
130 | 131 | .sorted_by(|a, b| Ord::cmp(&a.2, &b.2))
|
131 | 132 | .filter(|val| val.2 != MediaTypeMatch::None)
|
132 |
| - .next().map(|result| result.0.to_string()) |
| 133 | + .next() |
| 134 | + .map(|result| result.0.to_string()) |
133 | 135 | } else {
|
134 |
| - resource.produces.first().map(|s| s.to_string()) |
| 136 | + resource.produces().first().map(|s| s.to_string()) |
135 | 137 | }
|
136 | 138 | }
|
137 | 139 |
|
@@ -221,25 +223,25 @@ pub fn sort_media_languages(media_languages: &Vec<HeaderValue>) -> Vec<MediaLang
|
221 | 223 |
|
222 | 224 | /// Determines if the languages produced by the resource matches the acceptable languages
|
223 | 225 | /// provided by the client. Returns the match if there is one.
|
224 |
| -pub fn matching_language(resource: &WebmachineResource, request: &WebmachineRequest) -> Option<String> { |
| 226 | +pub fn matching_language(resource: &(dyn Resource + Send + Sync), request: &WebmachineRequest) -> Option<String> { |
225 | 227 | if request.has_accept_language_header() && !request.accept_language().is_empty() {
|
226 | 228 | let acceptable_languages = sort_media_languages(&request.accept_language());
|
227 |
| - if resource.languages_provided.is_empty() { |
| 229 | + if resource.languages_provided().is_empty() { |
228 | 230 | acceptable_languages.first().map(|lang| lang.to_string())
|
229 | 231 | } else {
|
230 | 232 | acceptable_languages.iter()
|
231 |
| - .cartesian_product(resource.languages_provided.iter()) |
| 233 | + .cartesian_product(resource.languages_provided().iter()) |
232 | 234 | .map(|(acceptable_language, produced_language)| {
|
233 | 235 | let produced_language = MediaLanguage::parse_string(produced_language);
|
234 | 236 | (produced_language.clone(), produced_language.matches(&acceptable_language))
|
235 | 237 | })
|
236 | 238 | .find(|val| val.1)
|
237 | 239 | .map(|result| result.0.to_string())
|
238 | 240 | }
|
239 |
| - } else if resource.languages_provided.is_empty() { |
| 241 | + } else if resource.languages_provided().is_empty() { |
240 | 242 | Some("*".to_string())
|
241 | 243 | } else {
|
242 |
| - resource.languages_provided.first().map(|s| s.to_string()) |
| 244 | + resource.languages_provided().first().map(|s| s.to_string()) |
243 | 245 | }
|
244 | 246 | }
|
245 | 247 |
|
@@ -311,25 +313,25 @@ pub fn sort_media_charsets(charsets: &Vec<HeaderValue>) -> Vec<Charset> {
|
311 | 313 |
|
312 | 314 | /// Determines if the charsets produced by the resource matches the acceptable charsets
|
313 | 315 | /// provided by the client. Returns the match if there is one.
|
314 |
| -pub fn matching_charset(resource: &WebmachineResource, request: &WebmachineRequest) -> Option<String> { |
| 316 | +pub fn matching_charset(resource: &(dyn Resource + Send + Sync), request: &WebmachineRequest) -> Option<String> { |
315 | 317 | if request.has_accept_charset_header() && !request.accept_charset().is_empty() {
|
316 | 318 | let acceptable_charsets = sort_media_charsets(&request.accept_charset());
|
317 |
| - if resource.charsets_provided.is_empty() { |
| 319 | + if resource.charsets_provided().is_empty() { |
318 | 320 | acceptable_charsets.first().map(|cs| cs.to_string())
|
319 | 321 | } else {
|
320 | 322 | acceptable_charsets.iter()
|
321 |
| - .cartesian_product(resource.charsets_provided.iter()) |
| 323 | + .cartesian_product(resource.charsets_provided().iter()) |
322 | 324 | .map(|(acceptable_charset, provided_charset)| {
|
323 | 325 | let provided_charset = Charset::parse_string(provided_charset);
|
324 | 326 | (provided_charset.clone(), provided_charset.matches(&acceptable_charset))
|
325 | 327 | })
|
326 | 328 | .find(|val| val.1)
|
327 | 329 | .map(|result| result.0.to_string())
|
328 | 330 | }
|
329 |
| - } else if resource.charsets_provided.is_empty() { |
| 331 | + } else if resource.charsets_provided().is_empty() { |
330 | 332 | Some("ISO-8859-1".to_string())
|
331 | 333 | } else {
|
332 |
| - resource.charsets_provided.first().map(|s| s.to_string()) |
| 334 | + resource.charsets_provided().first().map(|s| s.to_string()) |
333 | 335 | }
|
334 | 336 | }
|
335 | 337 |
|
@@ -401,29 +403,29 @@ pub fn sort_encodings(encodings: &Vec<HeaderValue>) -> Vec<Encoding> {
|
401 | 403 |
|
402 | 404 | /// Determines if the encodings supported by the resource matches the acceptable encodings
|
403 | 405 | /// provided by the client. Returns the match if there is one.
|
404 |
| -pub fn matching_encoding(resource: &WebmachineResource, request: &WebmachineRequest) -> Option<String> { |
| 406 | +pub fn matching_encoding(resource: &(dyn Resource + Send + Sync), request: &WebmachineRequest) -> Option<String> { |
405 | 407 | let identity = Encoding::parse_string("identity");
|
406 | 408 | if request.has_accept_encoding_header() {
|
407 | 409 | let acceptable_encodings = sort_encodings(&request.accept_encoding());
|
408 |
| - if resource.encodings_provided.is_empty() { |
| 410 | + if resource.encodings_provided().is_empty() { |
409 | 411 | if acceptable_encodings.contains(&identity) {
|
410 | 412 | Some("identity".to_string())
|
411 | 413 | } else {
|
412 | 414 | None
|
413 | 415 | }
|
414 | 416 | } else {
|
415 | 417 | acceptable_encodings.iter()
|
416 |
| - .cartesian_product(resource.encodings_provided.iter()) |
| 418 | + .cartesian_product(resource.encodings_provided().iter()) |
417 | 419 | .map(|(acceptable_encoding, provided_encoding)| {
|
418 | 420 | let provided_encoding = Encoding::parse_string(provided_encoding);
|
419 | 421 | (provided_encoding.clone(), provided_encoding.matches(&acceptable_encoding))
|
420 | 422 | })
|
421 | 423 | .find(|val| val.1)
|
422 | 424 | .map(|result| { result.0.to_string() })
|
423 | 425 | }
|
424 |
| - } else if resource.encodings_provided.is_empty() { |
| 426 | + } else if resource.encodings_provided().is_empty() { |
425 | 427 | Some("identity".to_string())
|
426 | 428 | } else {
|
427 |
| - resource.encodings_provided.first().map(|s| s.to_string()) |
| 429 | + resource.encodings_provided().first().map(|s| s.to_string()) |
428 | 430 | }
|
429 | 431 | }
|
0 commit comments