diff --git a/src/NzbDrone.Common.Test/Http/HttpClientFixture.cs b/src/NzbDrone.Common.Test/Http/HttpClientFixture.cs index 4ee2c24c1..7a6118c1e 100644 --- a/src/NzbDrone.Common.Test/Http/HttpClientFixture.cs +++ b/src/NzbDrone.Common.Test/Http/HttpClientFixture.cs @@ -146,7 +146,7 @@ namespace NzbDrone.Common.Test.Http var request = new HttpRequest($"https://expired.badssl.com"); Assert.Throws(() => Subject.Execute(request)); - ExceptionVerification.ExpectedErrors(2); + ExceptionVerification.ExpectedErrors(1); } [Test] diff --git a/src/NzbDrone.Common/Http/Dispatchers/ManagedHttpDispatcher.cs b/src/NzbDrone.Common/Http/Dispatchers/ManagedHttpDispatcher.cs index ab41c132b..0a33085a1 100644 --- a/src/NzbDrone.Common/Http/Dispatchers/ManagedHttpDispatcher.cs +++ b/src/NzbDrone.Common/Http/Dispatchers/ManagedHttpDispatcher.cs @@ -26,20 +26,17 @@ namespace NzbDrone.Common.Http.Dispatchers private readonly ICertificateValidationService _certificateValidationService; private readonly IUserAgentBuilder _userAgentBuilder; private readonly ICached _httpClientCache; - private readonly Logger _logger; public ManagedHttpDispatcher(IHttpProxySettingsProvider proxySettingsProvider, ICreateManagedWebProxy createManagedWebProxy, ICertificateValidationService certificateValidationService, IUserAgentBuilder userAgentBuilder, - ICacheManager cacheManager, - Logger logger) + ICacheManager cacheManager) { _proxySettingsProvider = proxySettingsProvider; _createManagedWebProxy = createManagedWebProxy; _certificateValidationService = certificateValidationService; _userAgentBuilder = userAgentBuilder; - _logger = logger; _httpClientCache = cacheManager.GetCache(typeof(ManagedHttpDispatcher)); } @@ -79,49 +76,32 @@ namespace NzbDrone.Common.Http.Dispatchers var httpClient = GetClient(request.Url); - HttpResponseMessage responseMessage; - - try - { - responseMessage = httpClient.Send(requestMessage, cts.Token); - } - catch (HttpRequestException e) + using var responseMessage = httpClient.Send(requestMessage, HttpCompletionOption.ResponseHeadersRead, cts.Token); { - _logger.Error(e, "HttpClient error"); - throw; - } - - byte[] data = null; + byte[] data = null; - using (var responseStream = responseMessage.Content.ReadAsStream()) - { - if (responseStream != null && responseStream != Stream.Null) + try { - try + if (request.ResponseStream != null && responseMessage.StatusCode == HttpStatusCode.OK) { - if (request.ResponseStream != null && responseMessage.StatusCode == HttpStatusCode.OK) - { - // A target ResponseStream was specified, write to that instead. - // But only on the OK status code, since we don't want to write failures and redirects. - responseStream.CopyTo(request.ResponseStream); - } - else - { - data = responseStream.ToBytes(); - } + responseMessage.Content.CopyTo(request.ResponseStream, null, cts.Token); } - catch (Exception ex) + else { - throw new WebException("Failed to read complete http response", ex, WebExceptionStatus.ReceiveFailure, null); + data = responseMessage.Content.ReadAsByteArrayAsync(cts.Token).GetAwaiter().GetResult(); } } - } + catch (Exception ex) + { + throw new WebException("Failed to read complete http response", ex, WebExceptionStatus.ReceiveFailure, null); + } - var headers = responseMessage.Headers.ToNameValueCollection(); + var headers = responseMessage.Headers.ToNameValueCollection(); - headers.Add(responseMessage.Content.Headers.ToNameValueCollection()); + headers.Add(responseMessage.Content.Headers.ToNameValueCollection()); - return new HttpResponse(request, new HttpHeader(headers), data, responseMessage.StatusCode); + return new HttpResponse(request, new HttpHeader(headers), data, responseMessage.StatusCode); + } } protected virtual System.Net.Http.HttpClient GetClient(HttpUri uri) diff --git a/src/NzbDrone.Core.Test/Framework/CoreTest.cs b/src/NzbDrone.Core.Test/Framework/CoreTest.cs index a83096d80..e7958e02b 100644 --- a/src/NzbDrone.Core.Test/Framework/CoreTest.cs +++ b/src/NzbDrone.Core.Test/Framework/CoreTest.cs @@ -27,7 +27,7 @@ namespace NzbDrone.Core.Test.Framework Mocker.SetConstant(new HttpProxySettingsProvider(Mocker.Resolve())); Mocker.SetConstant(new ManagedWebProxyFactory(Mocker.Resolve())); Mocker.SetConstant(new X509CertificateValidationService(Mocker.Resolve(), TestLogger)); - Mocker.SetConstant(new ManagedHttpDispatcher(Mocker.Resolve(), Mocker.Resolve(), Mocker.Resolve(), Mocker.Resolve(), Mocker.Resolve(), TestLogger)); + Mocker.SetConstant(new ManagedHttpDispatcher(Mocker.Resolve(), Mocker.Resolve(), Mocker.Resolve(), Mocker.Resolve(), Mocker.Resolve())); Mocker.SetConstant(new HttpClient(Array.Empty(), Mocker.Resolve(), Mocker.Resolve(), Mocker.Resolve(), TestLogger)); Mocker.SetConstant(new RadarrCloudRequestBuilder()); }