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