Skip to content

Commit 3a7178b

Browse files
Added default parameters to the request. They got missing somehow. (#2021)
1 parent 205d170 commit 3a7178b

File tree

7 files changed

+91
-19
lines changed

7 files changed

+91
-19
lines changed

src/RestSharp/Request/RequestContent.cs

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,20 +23,22 @@
2323
namespace RestSharp;
2424

2525
class RequestContent : IDisposable {
26-
readonly RestClient _client;
27-
readonly RestRequest _request;
28-
readonly List<Stream> _streams = new();
26+
readonly RestClient _client;
27+
readonly RestRequest _request;
28+
readonly List<Stream> _streams = new();
29+
readonly ParametersCollection _parameters;
2930

3031
HttpContent? Content { get; set; }
3132

3233
public RequestContent(RestClient client, RestRequest request) {
33-
_client = client;
34-
_request = request;
34+
_client = client;
35+
_request = request;
36+
_parameters = new ParametersCollection(_request.Parameters.Union(_client.DefaultParameters));
3537
}
3638

3739
public HttpContent BuildContent() {
3840
AddFiles();
39-
var postParameters = _request.Parameters.GetContentParameters(_request.Method).ToArray();
41+
var postParameters = _parameters.GetContentParameters(_request.Method).ToArray();
4042
AddBody(postParameters.Length > 0);
4143
AddPostParameters(postParameters);
4244
AddHeaders();
@@ -170,15 +172,15 @@ void AddPostParameters(GetOrPostParameter[] postParameters) {
170172
#else
171173
// However due to bugs in HttpClient FormUrlEncodedContent (see https://github.com/restsharp/RestSharp/issues/1814) we
172174
// do the encoding ourselves using WebUtility.UrlEncode instead.
173-
var encodedItems = postParameters.Select(x => $"{x.Name!.UrlEncode()}={x.Value?.ToString()?.UrlEncode() ?? string.Empty}");
175+
var encodedItems = postParameters.Select(x => $"{x.Name!.UrlEncode()}={x.Value?.ToString()?.UrlEncode() ?? string.Empty}");
174176
var encodedContent = new StringContent(encodedItems.JoinToString("&"), null, ContentType.FormUrlEncoded.Value);
175177
Content = encodedContent;
176178
#endif
177179
}
178180
}
179181

180182
void AddHeaders() {
181-
var contentHeaders = _request.Parameters
183+
var contentHeaders = _parameters
182184
.GetParameters<HeaderParameter>()
183185
.Where(x => IsContentHeader(x.Name!))
184186
.ToArray();
Lines changed: 38 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,62 @@
1+
using System.Net;
12
using RestSharp.Tests.Integrated.Fixtures;
3+
using RestSharp.Tests.Integrated.Server;
24
using RestSharp.Tests.Shared.Fixtures;
35

46
namespace RestSharp.Tests.Integrated;
57

6-
public class HttpHeadersTests : CaptureFixture {
8+
[Collection(nameof(TestServerCollection))]
9+
public class HttpHeadersTests {
710
readonly ITestOutputHelper _output;
11+
readonly RestClient _client;
812

9-
public HttpHeadersTests(ITestOutputHelper output) => _output = output;
13+
public HttpHeadersTests(TestServerFixture fixture, ITestOutputHelper output) {
14+
_output = output;
15+
_client = new RestClient(new RestClientOptions(fixture.Server.Url) { ThrowOnAnyError = true });
16+
}
1017

1118
[Fact]
1219
public async Task Ensure_headers_correctly_set_in_the_hook() {
1320
const string headerName = "HeaderName";
1421
const string headerValue = "HeaderValue";
1522

16-
using var server = SimpleServer.Create(Handlers.Generic<RequestHeadCapturer>());
17-
18-
// Prepare
19-
var client = new RestClient(server.Url);
20-
21-
var request = new RestRequest(RequestHeadCapturer.Resource) {
23+
var request = new RestRequest("/headers") {
2224
OnBeforeRequest = http => {
2325
http.Headers.Add(headerName, headerValue);
2426
return default;
2527
}
2628
};
2729

2830
// Run
29-
await client.ExecuteAsync(request);
31+
var response = await _client.ExecuteAsync<TestServerResponse[]>(request);
3032

3133
// Assert
32-
RequestHeadCapturer.CapturedHeaders[headerName].Should().Be(headerValue);
34+
response.StatusCode.Should().Be(HttpStatusCode.OK);
35+
var header = response.Data!.First(x => x.Name == headerName);
36+
header.Should().NotBeNull();
37+
header.Value.Should().Be(headerValue);
3338
}
39+
40+
[Fact]
41+
public async Task Should_use_both_default_and_request_headers() {
42+
var defaultHeader = new Header("defName", "defValue");
43+
var requestHeader = new Header("reqName", "reqValue");
44+
45+
_client.AddDefaultHeader(defaultHeader.Name, defaultHeader.Value);
46+
47+
var request = new RestRequest("/headers")
48+
.AddHeader(requestHeader.Name, requestHeader.Value);
49+
50+
var response = await _client.ExecuteAsync<TestServerResponse[]>(request);
51+
CheckHeader(defaultHeader);
52+
CheckHeader(requestHeader);
53+
54+
void CheckHeader(Header header) {
55+
var h = response.Data!.First(x => x.Name == header.Name);
56+
h.Should().NotBeNull();
57+
h.Value.Should().Be(header.Value);
58+
}
59+
}
60+
61+
record Header(string Name, string Value);
3462
}

test/RestSharp.Tests.Integrated/PostTests.cs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,32 @@ public async Task Should_post_large_form_data() {
4747
response.Data!.Message.Should().Be($"Works! Length: {length}");
4848
}
4949

50+
[Fact]
51+
public async Task Should_post_both_default_and_request_parameters() {
52+
var defParam = new PostParameter("default", "default");
53+
var reqParam = new PostParameter("request", "request");
54+
55+
_client.AddDefaultParameter(defParam.Name, defParam.Value);
56+
57+
var request = new RestRequest("post/data")
58+
.AddParameter(reqParam.Name, reqParam.Value);
59+
60+
var response = await _client.ExecutePostAsync<TestServerResponse[]>(request);
61+
response.StatusCode.Should().Be(HttpStatusCode.OK);
62+
63+
CheckResponse(defParam);
64+
CheckResponse(reqParam);
65+
66+
void CheckResponse(PostParameter parameter) {
67+
var p = response.Data!.FirstOrDefault(x => x.Name == parameter.Name);
68+
p.Should().NotBeNull();
69+
p.Value.Should().Be(parameter.Value);
70+
}
71+
}
72+
5073
class Response {
5174
public string Message { get; set; }
5275
}
76+
77+
record PostParameter(string Name, string Value);
5378
}

test/RestSharp.Tests.Integrated/RequestHeadTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ public async Task Passes_Default_Credentials_When_UseDefaultCredentials_Is_True(
5454
response.StatusCode.ToString().Should().BeOneOf(HttpStatusCode.OK.ToString(),HttpStatusCode.Unauthorized.ToString());
5555
RequestHeadCapturer.CapturedHeaders.Should().NotBeNull();
5656

57-
var keys = RequestHeadCapturer.CapturedHeaders.Keys.Cast<string>().ToArray();
57+
var keys = RequestHeadCapturer.CapturedHeaders!.Keys.Cast<string>().ToArray();
5858

5959
keys.Should()
6060
.Contain(
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
using Microsoft.AspNetCore.Http;
2+
3+
namespace RestSharp.Tests.Integrated.Server.Handlers;
4+
5+
public static class FormRequestHandler {
6+
public static IResult HandleForm(HttpContext ctx) {
7+
var response = ctx.Request.Form.Select(
8+
x => new TestServerResponse(x.Key, x.Value)
9+
);
10+
return Results.Ok(response);
11+
}
12+
}

test/RestSharp.Tests.Integrated/Server/TestServer.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,8 @@ public HttpServer(ITestOutputHelper? output = null) {
6161
"/post/form",
6262
(HttpContext context) => new TestResponse { Message = $"Works! Length: {context.Request.Form["big_string"].ToString().Length}" }
6363
);
64+
65+
_app.MapPost("/post/data", FormRequestHandler.HandleForm);
6466
}
6567

6668
public Uri Url => new(Address);

test/RestSharp.Tests.Serializers.Xml/SampleClasses/twitter.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
using RestSharp.Serializers;
2+
// ReSharper disable InconsistentNaming
23

34
namespace RestSharp.Tests.Serializers.Xml.SampleClasses;
45

6+
#pragma warning disable CS8981
57
public class status {
8+
#pragma warning restore CS8981
69
public bool truncated { get; set; }
710

811
public string created_at { get; set; }

0 commit comments

Comments
 (0)