diff --git a/src/RestSharp/Request/RestRequestExtensions.Url.cs b/src/RestSharp/Request/RestRequestExtensions.Url.cs index ff7d4e829..499c629df 100644 --- a/src/RestSharp/Request/RestRequestExtensions.Url.cs +++ b/src/RestSharp/Request/RestRequestExtensions.Url.cs @@ -26,7 +26,7 @@ public static partial class RestRequestExtensions { /// Encode the value or not, default true /// public RestRequest AddUrlSegment(string name, string? value, bool encode = true) - => request.AddParameter(new UrlSegmentParameter(name, value, encode)); + => request.AddOrUpdateParameter(new UrlSegmentParameter(name, value, encode)); /// /// Adds a URL segment parameter to the request. The resource URL must have a placeholder for the parameter for it to work. diff --git a/test/RestSharp.Tests/Parameters/UrlSegmentTests.cs b/test/RestSharp.Tests/Parameters/UrlSegmentTests.cs index 063a1f92a..5282dc57c 100644 --- a/test/RestSharp.Tests/Parameters/UrlSegmentTests.cs +++ b/test/RestSharp.Tests/Parameters/UrlSegmentTests.cs @@ -54,7 +54,7 @@ public void UrlSegmentParameter_WithValueWithEncodedSlash_WillReplaceEncodedSlas var urlSegmentParameter = new UrlSegmentParameter("foo", inputValue); urlSegmentParameter.Value.Should().BeEquivalentTo("bar/BAR"); } - + [Theory] [InlineData("bar%2fBAR")] [InlineData("bar%2FBAR")] @@ -62,7 +62,7 @@ public void UrlSegmentParameter_WithValueWithEncodedSlash_CanReplaceEncodedSlash var urlSegmentParameter = new UrlSegmentParameter("foo", inputValue, replaceEncodedSlash: true); urlSegmentParameter.Value.Should().BeEquivalentTo("bar/BAR"); } - + [Theory] [InlineData("bar%2fBAR")] [InlineData("bar%2FBAR")] @@ -70,4 +70,17 @@ public void UrlSegmentParameter_WithValueWithEncodedSlash_CanLeaveEncodedSlash(s var urlSegmentParameter = new UrlSegmentParameter("foo", inputValue, replaceEncodedSlash: false); urlSegmentParameter.Value.Should().BeEquivalentTo(inputValue); } + + [Fact] + public void AddSameUrlSegmentTwice_ShouldReplaceFirst() { + var client = new RestClient(); + var request = new RestRequest("https://api.example.com/orgs/{segment}/something"); + request.AddUrlSegment("segment", 1); + var url1 = client.BuildUri(request); + request.AddUrlSegment("segment", 2); + var url2 = client.BuildUri(request); + + url1.AbsolutePath.Should().Be("/orgs/1/something"); + url2.AbsolutePath.Should().Be("/orgs/2/something"); + } } \ No newline at end of file diff --git a/test/RestSharp.Tests/UrlBuilderTests.Get.cs b/test/RestSharp.Tests/UrlBuilderTests.Get.cs index f6b2c4d58..85c04b35e 100644 --- a/test/RestSharp.Tests/UrlBuilderTests.Get.cs +++ b/test/RestSharp.Tests/UrlBuilderTests.Get.cs @@ -198,4 +198,30 @@ public void GET_wth_trailing_slash_and_query_parameters() { var output = client.BuildUri(request); Assert.Equal(expected, output); } + + [Fact] + public void Multiple_query_parameters_with_same_name() { + var request = new RestRequest($"/{Resource}/") + .AddQueryParameter("foo", "bar") + .AddQueryParameter("foo", "baz"); + var expected = new Uri($"{Base}/{Resource}/?foo=bar&foo=baz"); + + using var client = new RestClient(Base); + + var output = client.BuildUri(request); + Assert.Equal(expected, output); + } + + [Fact] + public void Query_parameter_with_non_string_value() { + var request = new RestRequest($"/{Resource}/") + .AddQueryParameter("foo", 123) + .AddQueryParameter("bar", true); + var expected = new Uri($"{Base}/{Resource}/?foo=123&bar=True"); + + using var client = new RestClient(Base); + + var output = client.BuildUri(request); + Assert.Equal(expected, output); + } } \ No newline at end of file