From 27da524391d958ac7ee40ca77d4c3d23c4bc2a4b Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sat, 16 Sep 2023 15:07:39 +0300 Subject: [PATCH] Use async requests for media cover proxy (cherry picked from commit ad1f185330a30a2a9d27c9d3f18d384e66727c2a) Closes #9183 --- src/NzbDrone.Core/MediaCover/MediaCoverProxy.cs | 8 +++++--- .../Frontend/Mappers/IMapHttpRequestsToDisk.cs | 3 ++- .../Frontend/Mappers/MediaCoverProxyMapper.cs | 7 ++++--- .../Mappers/StaticResourceMapperBase.cs | 7 ++++--- .../Frontend/StaticResourceController.cs | 17 +++++++++-------- 5 files changed, 24 insertions(+), 18 deletions(-) diff --git a/src/NzbDrone.Core/MediaCover/MediaCoverProxy.cs b/src/NzbDrone.Core/MediaCover/MediaCoverProxy.cs index 8f6ed8c9a..b8b0cc3a0 100644 --- a/src/NzbDrone.Core/MediaCover/MediaCoverProxy.cs +++ b/src/NzbDrone.Core/MediaCover/MediaCoverProxy.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.IO; +using System.Threading.Tasks; using NzbDrone.Common.Cache; using NzbDrone.Common.Http; using NzbDrone.Core.Configuration; @@ -12,7 +13,7 @@ namespace NzbDrone.Core.MediaCover string RegisterUrl(string url); string GetUrl(string hash); - byte[] GetImage(string hash); + Task GetImage(string hash); } public class MediaCoverProxy : IMediaCoverProxy @@ -52,13 +53,14 @@ namespace NzbDrone.Core.MediaCover return result; } - public byte[] GetImage(string hash) + public async Task GetImage(string hash) { var url = GetUrl(hash); var request = new HttpRequest(url); + var response = await _httpClient.GetAsync(request); - return _httpClient.Get(request).ResponseData; + return response.ResponseData; } } } diff --git a/src/Radarr.Http/Frontend/Mappers/IMapHttpRequestsToDisk.cs b/src/Radarr.Http/Frontend/Mappers/IMapHttpRequestsToDisk.cs index 5c61e6f17..682c49f76 100644 --- a/src/Radarr.Http/Frontend/Mappers/IMapHttpRequestsToDisk.cs +++ b/src/Radarr.Http/Frontend/Mappers/IMapHttpRequestsToDisk.cs @@ -1,3 +1,4 @@ +using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; namespace Radarr.Http.Frontend.Mappers @@ -6,6 +7,6 @@ namespace Radarr.Http.Frontend.Mappers { string Map(string resourceUrl); bool CanHandle(string resourceUrl); - IActionResult GetResponse(string resourceUrl); + Task GetResponse(string resourceUrl); } } diff --git a/src/Radarr.Http/Frontend/Mappers/MediaCoverProxyMapper.cs b/src/Radarr.Http/Frontend/Mappers/MediaCoverProxyMapper.cs index 528fe7d2c..7abc80659 100644 --- a/src/Radarr.Http/Frontend/Mappers/MediaCoverProxyMapper.cs +++ b/src/Radarr.Http/Frontend/Mappers/MediaCoverProxyMapper.cs @@ -1,6 +1,7 @@ using System; using System.Net; using System.Text.RegularExpressions; +using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.StaticFiles; using NzbDrone.Core.MediaCover; @@ -9,7 +10,7 @@ namespace Radarr.Http.Frontend.Mappers { public class MediaCoverProxyMapper : IMapHttpRequestsToDisk { - private readonly Regex _regex = new Regex(@"/MediaCoverProxy/(?\w+)/(?(.+)\.(jpg|png|gif))"); + private readonly Regex _regex = new (@"/MediaCoverProxy/(?\w+)/(?(.+)\.(jpg|png|gif))"); private readonly IMediaCoverProxy _mediaCoverProxy; private readonly IContentTypeProvider _mimeTypeProvider; @@ -30,7 +31,7 @@ namespace Radarr.Http.Frontend.Mappers return resourceUrl.StartsWith("/MediaCoverProxy/", StringComparison.InvariantCultureIgnoreCase); } - public IActionResult GetResponse(string resourceUrl) + public async Task GetResponse(string resourceUrl) { var match = _regex.Match(resourceUrl); @@ -42,7 +43,7 @@ namespace Radarr.Http.Frontend.Mappers var hash = match.Groups["hash"].Value; var filename = match.Groups["filename"].Value; - var imageData = _mediaCoverProxy.GetImage(hash); + var imageData = await _mediaCoverProxy.GetImage(hash); if (!_mimeTypeProvider.TryGetContentType(filename, out var contentType)) { diff --git a/src/Radarr.Http/Frontend/Mappers/StaticResourceMapperBase.cs b/src/Radarr.Http/Frontend/Mappers/StaticResourceMapperBase.cs index 4a5992e8c..fc78cd3d4 100644 --- a/src/Radarr.Http/Frontend/Mappers/StaticResourceMapperBase.cs +++ b/src/Radarr.Http/Frontend/Mappers/StaticResourceMapperBase.cs @@ -1,6 +1,7 @@ using System; using System.IO; using System.Text; +using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.StaticFiles; using Microsoft.Net.Http.Headers; @@ -30,7 +31,7 @@ namespace Radarr.Http.Frontend.Mappers public abstract bool CanHandle(string resourceUrl); - public IActionResult GetResponse(string resourceUrl) + public Task GetResponse(string resourceUrl) { var filePath = Map(resourceUrl); @@ -41,10 +42,10 @@ namespace Radarr.Http.Frontend.Mappers contentType = "application/octet-stream"; } - return new FileStreamResult(GetContentStream(filePath), new MediaTypeHeaderValue(contentType) + return Task.FromResult(new FileStreamResult(GetContentStream(filePath), new MediaTypeHeaderValue(contentType) { Encoding = contentType == "text/plain" ? Encoding.UTF8 : null - }); + })); } _logger.Warn("File {0} not found", filePath); diff --git a/src/Radarr.Http/Frontend/StaticResourceController.cs b/src/Radarr.Http/Frontend/StaticResourceController.cs index 6ce9c7966..f4158e40f 100644 --- a/src/Radarr.Http/Frontend/StaticResourceController.cs +++ b/src/Radarr.Http/Frontend/StaticResourceController.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Cors; using Microsoft.AspNetCore.Mvc; @@ -25,27 +26,27 @@ namespace Radarr.Http.Frontend [AllowAnonymous] [HttpGet("login")] - public IActionResult LoginPage() + public async Task LoginPage() { - return MapResource("login"); + return await MapResource("login"); } [EnableCors("AllowGet")] [AllowAnonymous] [HttpGet("/content/{**path:regex(^(?!api/).*)}")] - public IActionResult IndexContent([FromRoute] string path) + public async Task IndexContent([FromRoute] string path) { - return MapResource("Content/" + path); + return await MapResource("Content/" + path); } [HttpGet("")] [HttpGet("/{**path:regex(^(?!(api|feed)/).*)}")] - public IActionResult Index([FromRoute] string path) + public async Task Index([FromRoute] string path) { - return MapResource(path); + return await MapResource(path); } - private IActionResult MapResource(string path) + private async Task MapResource(string path) { path = "/" + (path ?? ""); @@ -53,7 +54,7 @@ namespace Radarr.Http.Frontend if (mapper != null) { - var result = mapper.GetResponse(path); + var result = await mapper.GetResponse(path); if (result != null) {