#121 - Make the query parsing API public.
This commit is contained in:
parent
d61b683549
commit
c2934912af
|
|
@ -795,22 +795,6 @@ namespace Microsoft.AspNet.PipelineCore.Infrastructure
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
private static readonly char[] AmpersandAndSemicolon = new[] { '&', ';' };
|
|
||||||
|
|
||||||
internal static IDictionary<string, string[]> GetQuery(string queryString)
|
|
||||||
{
|
|
||||||
if (!string.IsNullOrEmpty(queryString) && queryString[0] == '?')
|
|
||||||
{
|
|
||||||
queryString = queryString.Substring(1);
|
|
||||||
}
|
|
||||||
var accumulator = new Dictionary<string, List<string>>(StringComparer.OrdinalIgnoreCase);
|
|
||||||
ParseDelimited(queryString, AmpersandAndSemicolon, AppendItemCallback, accumulator);
|
|
||||||
return accumulator.ToDictionary(
|
|
||||||
item => item.Key,
|
|
||||||
item => item.Value.ToArray(),
|
|
||||||
StringComparer.OrdinalIgnoreCase);
|
|
||||||
}
|
|
||||||
|
|
||||||
internal static string GetJoinedValue(IDictionary<string, string[]> store, string key)
|
internal static string GetJoinedValue(IDictionary<string, string[]> store, string key)
|
||||||
{
|
{
|
||||||
string[] values = GetUnmodifiedValues(store, key);
|
string[] values = GetUnmodifiedValues(store, key);
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,7 @@ using Microsoft.AspNet.FeatureModel;
|
||||||
using Microsoft.AspNet.Http;
|
using Microsoft.AspNet.Http;
|
||||||
using Microsoft.AspNet.HttpFeature;
|
using Microsoft.AspNet.HttpFeature;
|
||||||
using Microsoft.AspNet.PipelineCore.Infrastructure;
|
using Microsoft.AspNet.PipelineCore.Infrastructure;
|
||||||
|
using Microsoft.AspNet.WebUtilities;
|
||||||
using Microsoft.AspNet.WebUtilities.Collections;
|
using Microsoft.AspNet.WebUtilities.Collections;
|
||||||
|
|
||||||
namespace Microsoft.AspNet.PipelineCore
|
namespace Microsoft.AspNet.PipelineCore
|
||||||
|
|
@ -45,7 +46,7 @@ namespace Microsoft.AspNet.PipelineCore
|
||||||
if (_query == null || _queryString != queryString)
|
if (_query == null || _queryString != queryString)
|
||||||
{
|
{
|
||||||
_queryString = queryString;
|
_queryString = queryString;
|
||||||
_query = new ReadableStringCollection(ParsingHelpers.GetQuery(queryString));
|
_query = QueryHelpers.ParseQuery(queryString);
|
||||||
}
|
}
|
||||||
return _query;
|
return _query;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
using Microsoft.AspNet.Http;
|
using Microsoft.AspNet.Http;
|
||||||
using Microsoft.AspNet.WebUtilities.Collections;
|
using Microsoft.AspNet.WebUtilities.Collections;
|
||||||
|
|
||||||
|
|
@ -90,5 +91,21 @@ namespace Microsoft.AspNet.WebUtilities
|
||||||
string[] values;
|
string[] values;
|
||||||
return store.TryGetValue(key, out values) ? values : null;
|
return store.TryGetValue(key, out values) ? values : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static readonly char[] AmpersandAndSemicolon = new[] { '&', ';' };
|
||||||
|
|
||||||
|
internal static IReadableStringCollection GetQuery(string queryString)
|
||||||
|
{
|
||||||
|
if (!string.IsNullOrEmpty(queryString) && queryString[0] == '?')
|
||||||
|
{
|
||||||
|
queryString = queryString.Substring(1);
|
||||||
|
}
|
||||||
|
var accumulator = new Dictionary<string, List<string>>(StringComparer.OrdinalIgnoreCase);
|
||||||
|
ParseDelimited(queryString, AmpersandAndSemicolon, AppendItemCallback, accumulator);
|
||||||
|
return new ReadableStringCollection(accumulator.ToDictionary(
|
||||||
|
item => item.Key,
|
||||||
|
item => item.Value.ToArray(),
|
||||||
|
StringComparer.OrdinalIgnoreCase));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,7 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
|
using Microsoft.AspNet.Http;
|
||||||
|
|
||||||
namespace Microsoft.AspNet.WebUtilities
|
namespace Microsoft.AspNet.WebUtilities
|
||||||
{
|
{
|
||||||
|
|
@ -43,5 +44,15 @@ namespace Microsoft.AspNet.WebUtilities
|
||||||
}
|
}
|
||||||
return sb.ToString();
|
return sb.ToString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Parse a query string into its component key and value parts.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="text">The raw query string value, with or without the leading '?'.</param>
|
||||||
|
/// <returns>A collection of parsed keys and values.</returns>
|
||||||
|
public static IReadableStringCollection ParseQuery(string text)
|
||||||
|
{
|
||||||
|
return ParsingHelpers.GetQuery(text);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -0,0 +1,64 @@
|
||||||
|
// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
|
||||||
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using Xunit;
|
||||||
|
|
||||||
|
namespace Microsoft.AspNet.WebUtilities
|
||||||
|
{
|
||||||
|
public class QueryHelperTests
|
||||||
|
{
|
||||||
|
[Fact]
|
||||||
|
public void ParseQueryWithUniqueKeysWorks()
|
||||||
|
{
|
||||||
|
var collection = QueryHelpers.ParseQuery("?key1=value1&key2=value2");
|
||||||
|
Assert.Equal(2, collection.Count);
|
||||||
|
Assert.Equal("value1", collection["key1"]);
|
||||||
|
Assert.Equal("value2", collection["key2"]);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void ParseQueryWithoutQuestionmarkWorks()
|
||||||
|
{
|
||||||
|
var collection = QueryHelpers.ParseQuery("key1=value1&key2=value2");
|
||||||
|
Assert.Equal(2, collection.Count);
|
||||||
|
Assert.Equal("value1", collection["key1"]);
|
||||||
|
Assert.Equal("value2", collection["key2"]);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void ParseQueryWithDuplicateKeysGroups()
|
||||||
|
{
|
||||||
|
var collection = QueryHelpers.ParseQuery("?key1=valueA&key2=valueB&key1=valueC");
|
||||||
|
Assert.Equal(2, collection.Count);
|
||||||
|
Assert.Equal("valueA,valueC", collection["key1"]);
|
||||||
|
Assert.Equal("valueB", collection["key2"]);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void ParseQueryWithSemicolonWorks()
|
||||||
|
{
|
||||||
|
var collection = QueryHelpers.ParseQuery("?key1=value1;key2=value2");
|
||||||
|
Assert.Equal(2, collection.Count);
|
||||||
|
Assert.Equal("value1", collection["key1"]);
|
||||||
|
Assert.Equal("value2", collection["key2"]);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void ParseQueryWithEmptyValuesWorks()
|
||||||
|
{
|
||||||
|
var collection = QueryHelpers.ParseQuery("?key1=;key2=");
|
||||||
|
Assert.Equal(2, collection.Count);
|
||||||
|
Assert.Equal(string.Empty, collection["key1"]);
|
||||||
|
Assert.Equal(string.Empty, collection["key2"]);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void ParseQueryWithEmptyKeyWorks()
|
||||||
|
{
|
||||||
|
var collection = QueryHelpers.ParseQuery("?=value1;=");
|
||||||
|
Assert.Equal(1, collection.Count);
|
||||||
|
Assert.Equal("value1,", collection[""]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue