/// <inheritdoc /> public override Task <ProviderCultureResult> DetermineProviderCultureResult(IOwinContext httpContext) { if (httpContext == null) { throw new ArgumentNullException(nameof(httpContext)); } var acceptLanguageHeader = httpContext.Request.Headers.GetCommaSeparatedValues("Accept-Language"); if (acceptLanguageHeader == null || acceptLanguageHeader.Count == 0) { return(NullProviderCultureResult); } var languages = StringWithQualityHeaderValue.ParseList(acceptLanguageHeader); if (MaximumAcceptLanguageHeaderValuesToTry > 0) { // We take only the first configured number of languages from the header and then order those that we // attempt to parse as a CultureInfo to mitigate potentially spinning CPU on lots of parse attempts. languages = languages.Take(MaximumAcceptLanguageHeaderValuesToTry).ToList(); } var orderedLanguages = languages.OrderByDescending(h => h, StringWithQualityHeaderValueComparer.QualityComparer) .Select(x => x.Value).ToList(); if (orderedLanguages.Count > 0) { return(Task.FromResult(new ProviderCultureResult(orderedLanguages))); } return(NullProviderCultureResult); }
public void ParseList_SetOfValidValueStrings_ParsedCorrectly() { var inputs = new[] { "", "text1", "text2,", "textA,textB", "text3;q=0.5", "text4;q=0.5,", " text5 ; q = 0.50 ", "\r\n text6 ; q = 0.05 ", "text7,text8;q=0.5", " text9 , text10 ; q = 0.5 ", }; IList <StringWithQualityHeaderValue> results = StringWithQualityHeaderValue.ParseList(inputs); var expectedResults = new[] { new StringWithQualityHeaderValue("text1"), new StringWithQualityHeaderValue("text2"), new StringWithQualityHeaderValue("textA"), new StringWithQualityHeaderValue("textB"), new StringWithQualityHeaderValue("text3", 0.5), new StringWithQualityHeaderValue("text4", 0.5), new StringWithQualityHeaderValue("text5", 0.5), new StringWithQualityHeaderValue("text6", 0.05), new StringWithQualityHeaderValue("text7"), new StringWithQualityHeaderValue("text8", 0.5), new StringWithQualityHeaderValue("text9"), new StringWithQualityHeaderValue("text10", 0.5), }.ToList(); Assert.Equal(expectedResults, results); }
public void SortStringWithQualityHeaderValuesByQFactor_SortsCorrectly(IEnumerable <string> unsorted, IEnumerable <string> expectedSorted) { var unsortedValues = StringWithQualityHeaderValue.ParseList(unsorted.ToList()); var expectedSortedValues = StringWithQualityHeaderValue.ParseList(expectedSorted.ToList()); var actualSorted = unsortedValues.OrderByDescending(k => k, StringWithQualityHeaderValueComparer.QualityComparer).ToList(); Assert.True(expectedSortedValues.SequenceEqual(actualSorted)); }
private static string Negotiate(IList <string> acceptedValueStrings, IList <string> supportedValueStrings) { var acceptedValues = new List <StringWithQualityHeaderValue>(StringWithQualityHeaderValue.ParseList(acceptedValueStrings)); acceptedValues.Sort(StringWithQualityHeaderValueComparer.QualityComparer); foreach (var acceptedValue in acceptedValues) { var match = supportedValueStrings.FirstOrDefault(v => acceptedValue.Value == v); if (match != null) { return(match); } } return(null); }
public void ParseList_WithSomeInvalidValues_IgnoresInvalidValues() { var inputs = new[] { "", "text1", "text 1", "text2", "\"text 2\",", "text3;q=0.5", "text4;q=0.5, extra stuff", " text5 ; q = 0.50 ", "\r\n text6 ; q = 0.05 ", "text7,text8;q=0.5", " text9 , text10 ; q = 0.5 ", }; var results = StringWithQualityHeaderValue.ParseList(inputs); var expectedResults = new[] { new StringWithQualityHeaderValue("text1"), new StringWithQualityHeaderValue("1"), new StringWithQualityHeaderValue("text2"), new StringWithQualityHeaderValue("text3", 0.5), new StringWithQualityHeaderValue("text4", 0.5), new StringWithQualityHeaderValue("stuff"), new StringWithQualityHeaderValue("text5", 0.5), new StringWithQualityHeaderValue("text6", 0.05), new StringWithQualityHeaderValue("text7"), new StringWithQualityHeaderValue("text8", 0.5), new StringWithQualityHeaderValue("text9"), new StringWithQualityHeaderValue("text10", 0.5), }.ToList(); Assert.Equal(expectedResults, results); }