Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion src/RestSharp/Authenticators/OAuth/OAuth1Authenticator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -258,7 +258,6 @@ internal static void AddOAuthData(
? x => BaseQuery(x) && x.Name != null && x.Name.StartsWith("oauth_")
: (Func<Parameter, bool>)BaseQuery;

parameters.AddRange(client.DefaultParameters.Where(query).ToWebParameters());
parameters.AddRange(request.Parameters.Where(query).ToWebParameters());

workflow.RequestUrl = url;
Expand Down
7 changes: 2 additions & 5 deletions src/RestSharp/BuildUriExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -53,8 +53,7 @@ public Uri BuildUriWithoutQueryParameters(RestRequest request) {
var (uri, resource) = client.Options.BaseUrl.GetUrlSegmentParamsValues(
request.Resource,
client.Options.Encode,
request.Parameters,
client.DefaultParameters
request.Parameters
);
return uri.MergeBaseUrlAndResource(resource);
Comment on lines 53 to 59

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Action required

2. Builduri skips defaults 🐞 Bug ✓ Correctness

BuildUriWithoutQueryParameters and GetRequestQuery no longer include client.DefaultParameters,
so client.BuildUri* omits default URL segments and query parameters unless the request was
previously executed/mutated. This is a behavioral regression for a public API that’s expected to
reflect defaults used “on every request.”
Agent Prompt
### Issue description
`BuildUri*` no longer considers `client.DefaultParameters`, so URLs built via `client.BuildUri()` / `BuildUriString()` can omit default query params and URL segments.

### Issue Context
These methods are public API and are commonly used to inspect/preview the final request URI.

### Fix Focus Areas
- src/RestSharp/BuildUriExtensions.cs[50-58]
- src/RestSharp/BuildUriExtensions.cs[66-70]
- src/RestSharp/Request/UriExtensions.cs[50-66]
- src/RestSharp/IRestClient.cs[31-35]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

}
Expand All @@ -66,9 +65,7 @@ public Uri BuildUriWithoutQueryParameters(RestRequest request) {
/// <returns></returns>
[PublicAPI]
public string? GetRequestQuery(RestRequest request) {
var parametersCollections = new ParametersCollection[] { request.Parameters, client.DefaultParameters };

var parameters = parametersCollections.SelectMany(x => x.GetQueryParameters(request.Method)).ToList();
var parameters = request.Parameters.GetQueryParameters(request.Method).ToList();

return parameters.Count == 0 ? null : string.Join("&", parameters.Select(EncodeParameter).ToArray());

Expand Down
2 changes: 1 addition & 1 deletion src/RestSharp/Request/RequestContent.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ namespace RestSharp;

class RequestContent(IRestClient client, RestRequest request) : IDisposable {
readonly List<Stream> _streams = [];
readonly ParametersCollection _parameters = new RequestParameters(request.Parameters.Union(client.DefaultParameters));
readonly ParametersCollection _parameters = request.Parameters;

HttpContent? Content { get; set; }

Expand Down
9 changes: 8 additions & 1 deletion src/RestSharp/RestClient.Async.cs
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,14 @@ async Task<HttpResponse> ExecuteRequestAsync(RestRequest request, CancellationTo
}
#endif
CombineInterceptors(request);

// Merge default parameters into the request so they are visible in response.Request.Parameters
foreach (var defaultParam in DefaultParameters) {
if (!request.Parameters.Any(p => p.Name == defaultParam.Name && p.Type == defaultParam.Type)) {
request.Parameters.AddParameter(defaultParam);
}
}
Comment thread
alexeyzimarev marked this conversation as resolved.
Outdated

await OnBeforeRequest(request, cancellationToken).ConfigureAwait(false);
request.ValidateParameters();
var authenticator = request.Authenticator ?? Options.Authenticator;
Expand Down Expand Up @@ -131,7 +139,6 @@ async Task<HttpResponse> ExecuteRequestAsync(RestRequest request, CancellationTo

var headers = new RequestHeaders()
.AddHeaders(request.Parameters)
.AddHeaders(DefaultParameters)
.AddAcceptHeader(AcceptedContentTypes)
.AddCookieHeaders(url, cookieContainer)
.AddCookieHeaders(url, Options.CookieContainer);
Expand Down
19 changes: 19 additions & 0 deletions test/RestSharp.Tests.Integrated/HttpHeadersTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,25 @@ public async Task Should_sent_custom_UserAgent() {
response.GetHeaderValue("Server").Should().Be("Kestrel");
}

[Fact]
public async Task Default_headers_should_appear_in_response_request_parameters() {
const string headerName = "X-Custom-Default";
const string headerValue = "DefaultValue123";

_client.AddDefaultHeader(headerName, headerValue);

var request = new RestRequest("/headers");
var response = await _client.ExecuteAsync(request);

response.StatusCode.Should().Be(HttpStatusCode.OK);

var param = response.Request.Parameters
.FirstOrDefault(p => p.Name == headerName && p.Type == ParameterType.HttpHeader);

param.Should().NotBeNull();
param!.Value.Should().Be(headerValue);
}

static void CheckHeader(RestResponse<TestServerResponse[]> response, Header header) {
var h = FindHeader(response, header.Name);
h.Should().NotBeNull();
Expand Down
Loading