/// <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);
        }
예제 #2
0
    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);
    }
예제 #3
0
    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));
    }
예제 #4
0
        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);
        }
예제 #5
0
    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);
    }