Improve support to the dictionary returned by ParseQuery (#20133)

This commit is contained in:
Franklin Tse 2020-04-01 01:27:51 +08:00 committed by GitHub
parent 10a99c0990
commit 9249a95286
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 95 additions and 6 deletions

View File

@ -43,6 +43,7 @@ namespace Microsoft.AspNetCore.Http.Extensions
public partial class QueryBuilder : System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<string, string>>, System.Collections.IEnumerable
{
public QueryBuilder() { }
public QueryBuilder(System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<string, Microsoft.Extensions.Primitives.StringValues>> parameters) { }
public QueryBuilder(System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<string, string>> parameters) { }
public void Add(string key, System.Collections.Generic.IEnumerable<string> values) { }
public void Add(string key, string value) { }

View File

@ -3,8 +3,10 @@
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.Encodings.Web;
using Microsoft.Extensions.Primitives;
namespace Microsoft.AspNetCore.Http.Extensions
{
@ -23,6 +25,12 @@ namespace Microsoft.AspNetCore.Http.Extensions
_params = new List<KeyValuePair<string, string>>(parameters);
}
public QueryBuilder(IEnumerable<KeyValuePair<string, StringValues>> parameters)
: this(parameters.SelectMany(kvp => kvp.Value, (kvp, v) => KeyValuePair.Create(kvp.Key, v)))
{
}
public void Add(string key, IEnumerable<string> values)
{
foreach (var value in values)
@ -78,4 +86,4 @@ namespace Microsoft.AspNetCore.Http.Extensions
return _params.GetEnumerator();
}
}
}
}

View File

@ -3,6 +3,7 @@
using System;
using System.Collections.Generic;
using Microsoft.Extensions.Primitives;
using Xunit;
namespace Microsoft.AspNetCore.Http.Extensions
@ -70,6 +71,18 @@ namespace Microsoft.AspNetCore.Http.Extensions
Assert.Equal("?key1=value1&key2=value2&key3=value3", builder.ToString());
}
[Fact]
public void AddMultipleValuesViaConstructor_WithStringValues()
{
var builder = new QueryBuilder(new[]
{
new KeyValuePair<string, StringValues>("key1", new StringValues(new [] { "value1", string.Empty, "value3" })),
new KeyValuePair<string, StringValues>("key2", string.Empty),
new KeyValuePair<string, StringValues>("key3", StringValues.Empty)
});
Assert.Equal("?key1=value1&key1=&key1=value3&key2=", builder.ToString());
}
[Fact]
public void AddMultipleValuesViaInitializer_AddedInOrder()
{
@ -95,4 +108,4 @@ namespace Microsoft.AspNetCore.Http.Extensions
Assert.Equal("?key1=value1&key2=value2&key3=value3", builder1.ToString());
}
}
}
}

View File

@ -216,6 +216,8 @@ namespace Microsoft.AspNetCore.WebUtilities
public static partial class QueryHelpers
{
public static string AddQueryString(string uri, System.Collections.Generic.IDictionary<string, string> queryString) { throw null; }
public static string AddQueryString(string uri, System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<string, Microsoft.Extensions.Primitives.StringValues>> queryString) { throw null; }
public static string AddQueryString(string uri, System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<string, string>> queryString) { throw null; }
public static string AddQueryString(string uri, string name, string value) { throw null; }
public static System.Collections.Generic.Dictionary<string, Microsoft.Extensions.Primitives.StringValues> ParseNullableQuery(string queryString) { throw null; }
public static System.Collections.Generic.Dictionary<string, Microsoft.Extensions.Primitives.StringValues> ParseQuery(string queryString) { throw null; }

View File

@ -3,6 +3,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.Encodings.Web;
using Microsoft.Extensions.Primitives;
@ -46,10 +47,10 @@ namespace Microsoft.AspNetCore.WebUtilities
}
/// <summary>
/// Append the given query keys and values to the uri.
/// Append the given query keys and values to the URI.
/// </summary>
/// <param name="uri">The base uri.</param>
/// <param name="queryString">A collection of name value query pairs to append.</param>
/// <param name="uri">The base URI.</param>
/// <param name="queryString">A dictionary of query keys and values to append.</param>
/// <returns>The combined result.</returns>
/// <exception cref="ArgumentNullException"><paramref name="uri"/> is <c>null</c>.</exception>
/// <exception cref="ArgumentNullException"><paramref name="queryString"/> is <c>null</c>.</exception>
@ -68,7 +69,38 @@ namespace Microsoft.AspNetCore.WebUtilities
return AddQueryString(uri, (IEnumerable<KeyValuePair<string, string>>)queryString);
}
private static string AddQueryString(
/// <summary>
/// Append the given query keys and values to the URI.
/// </summary>
/// <param name="uri">The base URI.</param>
/// <param name="queryString">A collection of query names and values to append.</param>
/// <returns>The combined result.</returns>
/// <exception cref="ArgumentNullException"><paramref name="uri"/> is <c>null</c>.</exception>
/// <exception cref="ArgumentNullException"><paramref name="queryString"/> is <c>null</c>.</exception>
public static string AddQueryString(string uri, IEnumerable<KeyValuePair<string, StringValues>> queryString)
{
if (uri == null)
{
throw new ArgumentNullException(nameof(uri));
}
if (queryString == null)
{
throw new ArgumentNullException(nameof(queryString));
}
return AddQueryString(uri, queryString.SelectMany(kvp => kvp.Value, (kvp, v) => KeyValuePair.Create(kvp.Key, v)));
}
/// <summary>
/// Append the given query keys and values to the URI.
/// </summary>
/// <param name="uri">The base URI.</param>
/// <param name="queryString">A collection of name value query pairs to append.</param>
/// <returns>The combined result.</returns>
/// <exception cref="ArgumentNullException"><paramref name="uri"/> is <c>null</c>.</exception>
/// <exception cref="ArgumentNullException"><paramref name="queryString"/> is <c>null</c>.</exception>
public static string AddQueryString(
string uri,
IEnumerable<KeyValuePair<string, string>> queryString)
{

View File

@ -4,6 +4,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Extensions.Primitives;
using Xunit;
namespace Microsoft.AspNetCore.WebUtilities
@ -119,5 +120,37 @@ namespace Microsoft.AspNetCore.WebUtilities
var result = QueryHelpers.AddQueryString(uri, queryStrings);
Assert.Equal(expectedUri, result);
}
[Theory]
[InlineData("http://contoso.com/", "http://contoso.com/?param1=value1&param1=&param1=value3&param2=")]
[InlineData("http://contoso.com/someaction", "http://contoso.com/someaction?param1=value1&param1=&param1=value3&param2=")]
[InlineData("http://contoso.com/someaction?param2=1", "http://contoso.com/someaction?param2=1&param1=value1&param1=&param1=value3&param2=")]
[InlineData("http://contoso.com/some#action", "http://contoso.com/some?param1=value1&param1=&param1=value3&param2=#action")]
[InlineData("http://contoso.com/some?param2=1#action", "http://contoso.com/some?param2=1&param1=value1&param1=&param1=value3&param2=#action")]
[InlineData("http://contoso.com/#action", "http://contoso.com/?param1=value1&param1=&param1=value3&param2=#action")]
[InlineData(
"http://contoso.com/someaction?q=test#anchor?value",
"http://contoso.com/someaction?q=test&param1=value1&param1=&param1=value3&param2=#anchor?value")]
[InlineData(
"http://contoso.com/someaction#anchor?stuff",
"http://contoso.com/someaction?param1=value1&param1=&param1=value3&param2=#anchor?stuff")]
[InlineData(
"http://contoso.com/someaction?name?something",
"http://contoso.com/someaction?name?something&param1=value1&param1=&param1=value3&param2=")]
[InlineData(
"http://contoso.com/someaction#name#something",
"http://contoso.com/someaction?param1=value1&param1=&param1=value3&param2=#name#something")]
public void AddQueryStringWithEnumerableOfKeysAndStringValues(string uri, string expectedUri)
{
var queryStrings = new Dictionary<string, StringValues>()
{
{ "param1", new StringValues(new [] { "value1", string.Empty, "value3" }) },
{ "param2", string.Empty },
{ "param3", StringValues.Empty }
};
var result = QueryHelpers.AddQueryString(uri, queryStrings);
Assert.Equal(expectedUri, result);
}
}
}