1 // Copyright (c) Microsoft Corporation. All rights reserved. See License.txt in the project root for license information.
2 
3 using System.Diagnostics.Contracts;
4 using System.Net.Http.Headers;
5 
6 namespace System.Net.Http.Formatting
7 {
8     internal class ParsedMediaTypeHeaderValue
9     {
10         private const string MediaRangeAsterisk = "*";
11         private const char MediaTypeSubTypeDelimiter = '/';
12         private const string QualityFactorParameterName = "q";
13         private const double DefaultQualityFactor = 1.0;
14 
15         private MediaTypeHeaderValue _mediaType;
16         private string _type;
17         private string _subType;
18         private bool? _hasNonQualityFactorParameter;
19         private double? _qualityFactor;
20 
ParsedMediaTypeHeaderValue(MediaTypeHeaderValue mediaType)21         public ParsedMediaTypeHeaderValue(MediaTypeHeaderValue mediaType)
22         {
23             Contract.Assert(mediaType != null, "The 'mediaType' parameter should not be null.");
24 
25             _mediaType = mediaType;
26             string[] splitMediaType = mediaType.MediaType.Split(MediaTypeSubTypeDelimiter);
27 
28             Contract.Assert(splitMediaType.Length == 2, "The constructor of the MediaTypeHeaderValue would have failed if there wasn't a type and subtype.");
29 
30             _type = splitMediaType[0];
31             _subType = splitMediaType[1];
32         }
33 
34         public string Type
35         {
36             get { return _type; }
37         }
38 
39         public string SubType
40         {
41             get { return _subType; }
42         }
43 
44         public bool IsAllMediaRange
45         {
46             get { return IsSubTypeMediaRange && String.Equals(MediaRangeAsterisk, Type, StringComparison.Ordinal); }
47         }
48 
49         public bool IsSubTypeMediaRange
50         {
51             get { return String.Equals(MediaRangeAsterisk, SubType, StringComparison.Ordinal); }
52         }
53 
54         public bool HasNonQualityFactorParameter
55         {
56             get
57             {
58                 if (!_hasNonQualityFactorParameter.HasValue)
59                 {
60                     _hasNonQualityFactorParameter = false;
61                     foreach (NameValueHeaderValue param in _mediaType.Parameters)
62                     {
63                         if (!String.Equals(QualityFactorParameterName, param.Name, StringComparison.Ordinal))
64                         {
65                             _hasNonQualityFactorParameter = true;
66                         }
67                     }
68                 }
69 
70                 return _hasNonQualityFactorParameter.Value;
71             }
72         }
73 
74         public string CharSet
75         {
76             get { return _mediaType.CharSet; }
77         }
78 
79         public double QualityFactor
80         {
81             get
82             {
83                 if (!_qualityFactor.HasValue)
84                 {
85                     MediaTypeWithQualityHeaderValue mediaTypeWithQuality = _mediaType as MediaTypeWithQualityHeaderValue;
86                     if (mediaTypeWithQuality != null)
87                     {
88                         _qualityFactor = mediaTypeWithQuality.Quality;
89                     }
90 
91                     if (!_qualityFactor.HasValue)
92                     {
93                         _qualityFactor = DefaultQualityFactor;
94                     }
95                 }
96 
97                 return _qualityFactor.Value;
98             }
99         }
100     }
101 }
102