Skip to content

Commit c9482f3

Browse files
committed
Timeout as TimeSpan, Support custom request timeout
1 parent 2facbeb commit c9482f3

File tree

7 files changed

+13
-10
lines changed

7 files changed

+13
-10
lines changed

src/RestSharp/Options/RestClientOptions.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -172,10 +172,9 @@ public RestClientOptions(string baseUrl) : this(new Uri(Ensure.NotEmptyString(ba
172172
public CookieContainer? CookieContainer { get; set; }
173173

174174
/// <summary>
175-
/// Maximum request duration in milliseconds. When the request timeout is specified using <seealso cref="RestRequest.Timeout"/>,
176-
/// the lowest value between the client timeout and request timeout will be used.
175+
/// Request duration. Used when the request timeout is not specified using <seealso cref="RestRequest.Timeout"/>,
177176
/// </summary>
178-
public int MaxTimeout { get; set; }
177+
public TimeSpan? Timeout { get; set; }
179178

180179
/// <summary>
181180
/// Default encoding to use when no encoding is specified in the content type header.

src/RestSharp/Request/RestRequest.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ public RestRequest(Uri resource, Method method = Method.Get)
136136
/// <summary>
137137
/// Custom request timeout
138138
/// </summary>
139-
public int Timeout { get; set; }
139+
public TimeSpan? Timeout { get; set; }
140140

141141
/// <summary>
142142
/// The Resource URL to make the request against.

src/RestSharp/RestClient.Async.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
namespace RestSharp;
1919

2020
public partial class RestClient {
21+
// Default HttpClient timeout
22+
public TimeSpan DefaultTimeout = TimeSpan.FromSeconds(100);
2123
/// <inheritdoc />
2224
public async Task<RestResponse> ExecuteAsync(RestRequest request, CancellationToken cancellationToken = default) {
2325
using var internalResponse = await ExecuteRequestAsync(request, cancellationToken).ConfigureAwait(false);
@@ -90,7 +92,7 @@ async Task<HttpResponse> ExecuteRequestAsync(RestRequest request, CancellationTo
9092
message.Headers.Host = Options.BaseHost;
9193
message.Headers.CacheControl = request.CachePolicy ?? Options.CachePolicy;
9294

93-
using var timeoutCts = new CancellationTokenSource(request.Timeout > 0 ? request.Timeout : int.MaxValue);
95+
using var timeoutCts = new CancellationTokenSource(request.Timeout ?? Options.Timeout ?? DefaultTimeout);
9496
using var cts = CancellationTokenSource.CreateLinkedTokenSource(timeoutCts.Token, cancellationToken);
9597

9698
var ct = cts.Token;

src/RestSharp/RestClient.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,9 @@ public RestClient(
216216
: this(new HttpClient(handler, disposeHandler), true, configureRestClient, configureSerialization) { }
217217

218218
static void ConfigureHttpClient(HttpClient httpClient, RestClientOptions options) {
219-
if (options.MaxTimeout > 0) httpClient.Timeout = TimeSpan.FromMilliseconds(options.MaxTimeout);
219+
220+
// We will use Options.Timeout in ExecuteAsInternalAsync method
221+
httpClient.Timeout = Timeout.InfiniteTimeSpan;
220222

221223
if (options.UserAgent != null &&
222224
httpClient.DefaultRequestHeaders.UserAgent.All(x => $"{x.Product?.Name}/{x.Product?.Version}" != options.UserAgent)) {

test/RestSharp.Tests.Integrated/NonProtocolExceptionHandlingTests.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ public async Task Handles_HttpClient_Timeout_Error() {
5050
public async Task Handles_Server_Timeout_Error() {
5151
var client = new RestClient(_server.Url);
5252

53-
var request = new RestRequest("404") { Timeout = 500 };
53+
var request = new RestRequest("404") { Timeout = TimeSpan.FromMilliseconds(500) };
5454
var response = await client.ExecuteAsync(request);
5555

5656
response.ErrorException.Should().BeOfType<TaskCanceledException>();
@@ -60,7 +60,7 @@ public async Task Handles_Server_Timeout_Error() {
6060
[Fact]
6161
public async Task Handles_Server_Timeout_Error_With_Deserializer() {
6262
var client = new RestClient(_server.Url);
63-
var request = new RestRequest("404") { Timeout = 500 };
63+
var request = new RestRequest("404") { Timeout = TimeSpan.FromMilliseconds(500) };
6464
var response = await client.ExecuteAsync<TestResponse>(request);
6565

6666
response.Data.Should().BeNull();

test/RestSharp.Tests.Integrated/PutTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ public async Task Can_Timeout_PUT_Async() {
4040
var request = new RestRequest(TimeoutResource, Method.Put).AddBody("Body_Content");
4141

4242
// Half the value of ResponseHandler.Timeout
43-
request.Timeout = 200;
43+
request.Timeout = TimeSpan.FromMilliseconds(200);
4444

4545
var response = await _client.ExecuteAsync(request);
4646

test/RestSharp.Tests.Integrated/RequestTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ public async Task Can_Timeout_GET_Async() {
5757
var request = new RestRequest("timeout").AddBody("Body_Content");
5858

5959
// Half the value of ResponseHandler.Timeout
60-
request.Timeout = 200;
60+
request.Timeout = TimeSpan.FromMilliseconds(200);
6161

6262
var response = await _client.ExecuteAsync(request);
6363

0 commit comments

Comments
 (0)