1 // Copyright (c) Microsoft Corporation. All rights reserved. See License.txt in the project root for license information. 2 3 using System; 4 using System.Collections.Generic; 5 using System.Net.Http.Headers; 6 7 namespace Microsoft.TestCommon 8 { 9 public class MediaTypeHeaderValueComparer : IComparer<MediaTypeHeaderValue> 10 { 11 private static readonly MediaTypeHeaderValueComparer mediaTypeComparer = new MediaTypeHeaderValueComparer(); 12 MediaTypeHeaderValueComparer()13 public MediaTypeHeaderValueComparer() 14 { 15 } 16 17 public static MediaTypeHeaderValueComparer Comparer 18 { 19 get 20 { 21 return mediaTypeComparer; 22 } 23 } 24 Compare(MediaTypeHeaderValue mediaType1, MediaTypeHeaderValue mediaType2)25 public int Compare(MediaTypeHeaderValue mediaType1, MediaTypeHeaderValue mediaType2) 26 { 27 ParsedMediaTypeHeaderValue parsedMediaType1 = new ParsedMediaTypeHeaderValue(mediaType1); 28 ParsedMediaTypeHeaderValue parsedMediaType2 = new ParsedMediaTypeHeaderValue(mediaType2); 29 30 int returnValue = CompareBasedOnQualityFactor(parsedMediaType1, parsedMediaType2); 31 32 if (returnValue == 0) 33 { 34 if (!String.Equals(parsedMediaType1.Type, parsedMediaType2.Type, StringComparison.OrdinalIgnoreCase)) 35 { 36 if (parsedMediaType1.IsAllMediaRange) 37 { 38 return 1; 39 } 40 else if (parsedMediaType2.IsAllMediaRange) 41 { 42 return -1; 43 } 44 } 45 else if (!String.Equals(parsedMediaType1.SubType, parsedMediaType2.SubType, StringComparison.OrdinalIgnoreCase)) 46 { 47 if (parsedMediaType1.IsSubTypeMediaRange) 48 { 49 return 1; 50 } 51 else if (parsedMediaType2.IsSubTypeMediaRange) 52 { 53 return -1; 54 } 55 } 56 else 57 { 58 if (!parsedMediaType1.HasNonQualityFactorParameter) 59 { 60 if (parsedMediaType2.HasNonQualityFactorParameter) 61 { 62 return 1; 63 } 64 } 65 else if (!parsedMediaType2.HasNonQualityFactorParameter) 66 { 67 return -1; 68 } 69 } 70 } 71 72 return returnValue; 73 } 74 CompareBasedOnQualityFactor(ParsedMediaTypeHeaderValue parsedMediaType1, ParsedMediaTypeHeaderValue parsedMediaType2)75 private static int CompareBasedOnQualityFactor(ParsedMediaTypeHeaderValue parsedMediaType1, ParsedMediaTypeHeaderValue parsedMediaType2) 76 { 77 double qualityDifference = parsedMediaType1.QualityFactor - parsedMediaType2.QualityFactor; 78 if (qualityDifference < 0) 79 { 80 return 1; 81 } 82 else if (qualityDifference > 0) 83 { 84 return -1; 85 } 86 87 return 0; 88 } 89 } 90 }