From d0e021e8a9f702a60381af0c4e33671d778ff025 Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Tue, 5 Nov 2013 12:43:24 +1100 Subject: [PATCH] added test and bugfix for merging querystring parameters --- Octokit.Tests/Helpers/UriExtensionsTests.cs | 15 +++++++++++++++ Octokit/Helpers/UriExtensions.cs | 13 +++++++++++++ 2 files changed, 28 insertions(+) diff --git a/Octokit.Tests/Helpers/UriExtensionsTests.cs b/Octokit.Tests/Helpers/UriExtensionsTests.cs index b6a53719..e692773a 100644 --- a/Octokit.Tests/Helpers/UriExtensionsTests.cs +++ b/Octokit.Tests/Helpers/UriExtensionsTests.cs @@ -62,6 +62,21 @@ namespace Octokit.Tests.Helpers Assert.Equal(uri, uriWithNullParameters); } + [Fact] + public void CombinesExistingParametersWithNewParameters() + { + var uri = new Uri("https://api.github.com/repositories/1/milestones?state=closed&sort=due_date&direction=asc&page=2"); + + var parameters = new Dictionary { { "state", "open" }, { "sort", "other"} }; + + var actual = uri.ApplyParameters(parameters); + + Assert.True(actual.Query.Contains("state=open")); + Assert.True(actual.Query.Contains("sort=other")); + Assert.True(actual.Query.Contains("direction=asc")); + Assert.True(actual.Query.Contains("page=2")); + } + [Fact] public void EnsuresArgumentNotNull() { diff --git a/Octokit/Helpers/UriExtensions.cs b/Octokit/Helpers/UriExtensions.cs index d2d4a7f4..c074106a 100644 --- a/Octokit/Helpers/UriExtensions.cs +++ b/Octokit/Helpers/UriExtensions.cs @@ -12,6 +12,19 @@ namespace Octokit if (parameters == null || !parameters.Any()) return uri; + var existingParameters = uri.Query.Split(new[] { '&' }) + .ToDictionary( + key => key.Substring(0, key.IndexOf('=')), + value => value.Substring(value.IndexOf('=') + 1)); + + foreach (var existing in existingParameters) + { + if (!parameters.ContainsKey(existing.Key)) + { + parameters.Add(existing); + } + } + string query = String.Join("&", parameters.Select(kvp => kvp.Key + "=" + kvp.Value)); if (uri.IsAbsoluteUri) {