From 64c1e1fa549c4894112b5e743f6fea737d859e89 Mon Sep 17 00:00:00 2001 From: Qstick Date: Thu, 3 Feb 2022 23:16:20 -0600 Subject: [PATCH] Fixed: (Cardigann) Treat "Refresh" header as redirect Fixes #812 --- src/NzbDrone.Common/Http/HttpClient.cs | 2 +- src/NzbDrone.Common/Http/HttpResponse.cs | 19 +++++++++++++++++-- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/NzbDrone.Common/Http/HttpClient.cs b/src/NzbDrone.Common/Http/HttpClient.cs index 9c1e2221c..7be59b663 100644 --- a/src/NzbDrone.Common/Http/HttpClient.cs +++ b/src/NzbDrone.Common/Http/HttpClient.cs @@ -75,7 +75,7 @@ namespace NzbDrone.Common.Http do { - request.Url += new HttpUri(response.Headers.GetSingleValue("Location")); + request.Url = new HttpUri(response.RedirectUrl); autoRedirectChain.Add(request.Url.ToString()); _logger.Trace("Redirected to {0}", request.Url); diff --git a/src/NzbDrone.Common/Http/HttpResponse.cs b/src/NzbDrone.Common/Http/HttpResponse.cs index d108705b3..819b3b805 100644 --- a/src/NzbDrone.Common/Http/HttpResponse.cs +++ b/src/NzbDrone.Common/Http/HttpResponse.cs @@ -9,7 +9,7 @@ namespace NzbDrone.Common.Http { public class HttpResponse { - private static readonly Regex RegexSetCookie = new Regex("^(.*?)=(.*?)(?:;|$)", RegexOptions.Compiled); + private static readonly Regex RegexRefresh = new Regex("^(.*?url)=(.*?)(?:;|$)", RegexOptions.Compiled); public HttpResponse(HttpRequest request, HttpHeader headers, CookieCollection cookies, byte[] binaryData, long elapsedTime = 0, HttpStatusCode statusCode = HttpStatusCode.OK) { @@ -67,7 +67,8 @@ namespace NzbDrone.Common.Http StatusCode == HttpStatusCode.MovedPermanently || StatusCode == HttpStatusCode.RedirectMethod || StatusCode == HttpStatusCode.TemporaryRedirect || - StatusCode == HttpStatusCode.Found; + StatusCode == HttpStatusCode.Found || + Headers.ContainsKey("Refresh"); public string RedirectUrl { @@ -76,6 +77,20 @@ namespace NzbDrone.Common.Http var newUrl = Headers["Location"]; if (newUrl == null) { + newUrl = Headers["Refresh"]; + + if (newUrl == null) + { + return string.Empty; + } + + var match = RegexRefresh.Match(newUrl); + + if (match.Success) + { + return (Request.Url += new HttpUri(match.Groups[2].Value)).FullUri; + } + return string.Empty; }