From 2042ffce62d8c9e9c0e1e30119138b4d1d22e00a Mon Sep 17 00:00:00 2001 From: ta264 Date: Wed, 15 Dec 2021 22:04:09 +0000 Subject: [PATCH] Fixed: Don't buffer update package to memory when downloading [common] --- .../Http/HttpClientFixture.cs | 2 +- .../Http/Dispatchers/ManagedHttpDispatcher.cs | 56 ++++++------------- src/NzbDrone.Core.Test/Framework/CoreTest.cs | 2 +- 3 files changed, 20 insertions(+), 40 deletions(-) diff --git a/src/NzbDrone.Common.Test/Http/HttpClientFixture.cs b/src/NzbDrone.Common.Test/Http/HttpClientFixture.cs index 4ee2c24c16..7a6118c1e0 100644 --- a/src/NzbDrone.Common.Test/Http/HttpClientFixture.cs +++ b/src/NzbDrone.Common.Test/Http/HttpClientFixture.cs @@ -146,7 +146,7 @@ public void bad_ssl_should_fail_when_remote_validation_enabled(CertificateValida 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 ab41c132b7..0a33085a19 100644 --- a/src/NzbDrone.Common/Http/Dispatchers/ManagedHttpDispatcher.cs +++ b/src/NzbDrone.Common/Http/Dispatchers/ManagedHttpDispatcher.cs @@ -26,20 +26,17 @@ public class ManagedHttpDispatcher : IHttpDispatcher 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 @@ public HttpResponse GetResponse(HttpRequest request, CookieContainer cookies) var httpClient = GetClient(request.Url); - HttpResponseMessage responseMessage; - - try + using var responseMessage = httpClient.Send(requestMessage, HttpCompletionOption.ResponseHeadersRead, cts.Token); { - responseMessage = httpClient.Send(requestMessage, cts.Token); - } - catch (HttpRequestException e) - { - _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(); + + headers.Add(responseMessage.Content.Headers.ToNameValueCollection()); + + return new HttpResponse(request, new HttpHeader(headers), data, responseMessage.StatusCode); } - - var headers = responseMessage.Headers.ToNameValueCollection(); - - headers.Add(responseMessage.Content.Headers.ToNameValueCollection()); - - 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 a83096d804..e7958e02bd 100644 --- a/src/NzbDrone.Core.Test/Framework/CoreTest.cs +++ b/src/NzbDrone.Core.Test/Framework/CoreTest.cs @@ -27,7 +27,7 @@ protected void UseRealHttp() 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()); }