Skip to content

Commit 53b797b

Browse files
Fix credential/UseDefaultCredentials property order on HttpClientHandler (#2353)
In .NET Core, HttpClientHandler.Credentials and UseDefaultCredentials share a backing field, so setting one overwrites the other. Previously, Credentials was set first (often null), then UseDefaultCredentials — which worked. But setting Credentials = CredentialCache.DefaultCredentials explicitly would get overwritten by UseDefaultCredentials = false. Now UseDefaultCredentials is set first, and Credentials is only set when non-null, so neither property can silently clobber the other. Fixes #2236 Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 2802d8a commit 53b797b

2 files changed

Lines changed: 46 additions & 2 deletions

File tree

src/RestSharp/RestClient.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -234,8 +234,8 @@ internal static void ConfigureHttpMessageHandler(HttpClientHandler handler, Rest
234234
if (!OperatingSystem.IsBrowser()) {
235235
#endif
236236
handler.UseCookies = false;
237-
handler.Credentials = options.Credentials;
238-
handler.UseDefaultCredentials = options.UseDefaultCredentials;
237+
handler.UseDefaultCredentials = options.UseDefaultCredentials;
238+
if (options.Credentials != null) handler.Credentials = options.Credentials;
239239
handler.AutomaticDecompression = options.AutomaticDecompression;
240240
handler.PreAuthenticate = options.PreAuthenticate;
241241
if (options.MaxRedirects.HasValue) handler.MaxAutomaticRedirections = options.MaxRedirects.Value;
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
using System.Net;
2+
3+
namespace RestSharp.Tests;
4+
5+
public class CredentialConfigurationTests {
6+
[Fact]
7+
public void Explicit_credentials_are_not_overwritten_by_UseDefaultCredentials() {
8+
var credentials = new NetworkCredential("user", "password");
9+
var options = new RestClientOptions("https://dummy.org") {
10+
Credentials = credentials,
11+
UseDefaultCredentials = false
12+
};
13+
14+
var handler = new HttpClientHandler();
15+
RestClient.ConfigureHttpMessageHandler(handler, options);
16+
17+
handler.Credentials.Should().BeSameAs(credentials);
18+
}
19+
20+
[Fact]
21+
public void DefaultCredentials_set_explicitly_are_not_overwritten() {
22+
var options = new RestClientOptions("https://dummy.org") {
23+
Credentials = CredentialCache.DefaultCredentials,
24+
UseDefaultCredentials = false
25+
};
26+
27+
var handler = new HttpClientHandler();
28+
RestClient.ConfigureHttpMessageHandler(handler, options);
29+
30+
handler.Credentials.Should().BeSameAs(CredentialCache.DefaultCredentials);
31+
}
32+
33+
[Fact]
34+
public void UseDefaultCredentials_sets_credentials_when_no_explicit_credentials() {
35+
var options = new RestClientOptions("https://dummy.org") {
36+
UseDefaultCredentials = true
37+
};
38+
39+
var handler = new HttpClientHandler();
40+
RestClient.ConfigureHttpMessageHandler(handler, options);
41+
42+
handler.UseDefaultCredentials.Should().BeTrue();
43+
}
44+
}

0 commit comments

Comments
 (0)