mirror of
https://github.com/fergalmoran/Readarr.git
synced 2025-12-30 13:28:04 +00:00
Improved http timeout handling
(cherry picked from commit f87a66fcba6ca9ca972fa1c747a940b216e0e5e3)
This commit is contained in:
@@ -124,6 +124,16 @@ namespace NzbDrone.Common.Test.Http
|
|||||||
response.Content.Should().NotBeNullOrWhiteSpace();
|
response.Content.Should().NotBeNullOrWhiteSpace();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void should_throw_timeout_request()
|
||||||
|
{
|
||||||
|
var request = new HttpRequest($"https://{_httpBinHost}/delay/10");
|
||||||
|
|
||||||
|
request.RequestTimeout = new TimeSpan(0, 0, 5);
|
||||||
|
|
||||||
|
Assert.ThrowsAsync<WebException>(async () => await Subject.ExecuteAsync(request));
|
||||||
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public async Task should_execute_https_get()
|
public async Task should_execute_https_get()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -103,31 +103,38 @@ namespace NzbDrone.Common.Http.Dispatchers
|
|||||||
|
|
||||||
var httpClient = GetClient(request.Url);
|
var httpClient = GetClient(request.Url);
|
||||||
|
|
||||||
using var responseMessage = await httpClient.SendAsync(requestMessage, HttpCompletionOption.ResponseHeadersRead, cts.Token);
|
try
|
||||||
{
|
{
|
||||||
byte[] data = null;
|
using var responseMessage = await httpClient.SendAsync(requestMessage, HttpCompletionOption.ResponseHeadersRead, cts.Token);
|
||||||
|
|
||||||
try
|
|
||||||
{
|
{
|
||||||
if (request.ResponseStream != null && responseMessage.StatusCode == HttpStatusCode.OK)
|
byte[] data = null;
|
||||||
|
|
||||||
|
try
|
||||||
{
|
{
|
||||||
await responseMessage.Content.CopyToAsync(request.ResponseStream, null, cts.Token);
|
if (request.ResponseStream != null && responseMessage.StatusCode == HttpStatusCode.OK)
|
||||||
|
{
|
||||||
|
await responseMessage.Content.CopyToAsync(request.ResponseStream, null, cts.Token);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
data = await responseMessage.Content.ReadAsByteArrayAsync(cts.Token);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
data = await responseMessage.Content.ReadAsByteArrayAsync(cts.Token);
|
throw new WebException("Failed to read complete http response", ex, WebExceptionStatus.ReceiveFailure, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var headers = responseMessage.Headers.ToNameValueCollection();
|
||||||
|
|
||||||
|
headers.Add(responseMessage.Content.Headers.ToNameValueCollection());
|
||||||
|
|
||||||
|
return new HttpResponse(request, new HttpHeader(headers), data, responseMessage.StatusCode, responseMessage.Version);
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
}
|
||||||
{
|
catch (OperationCanceledException ex) when (cts.IsCancellationRequested)
|
||||||
throw new WebException("Failed to read complete http response", ex, WebExceptionStatus.ReceiveFailure, null);
|
{
|
||||||
}
|
throw new WebException("Http request timed out", ex.InnerException, WebExceptionStatus.Timeout, null);
|
||||||
|
|
||||||
var headers = responseMessage.Headers.ToNameValueCollection();
|
|
||||||
|
|
||||||
headers.Add(responseMessage.Content.Headers.ToNameValueCollection());
|
|
||||||
|
|
||||||
return new HttpResponse(request, new HttpHeader(headers), data, responseMessage.StatusCode, responseMessage.Version);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user