From d9e211472b2d8e88e1f50a07a6ce03fcd94f6da9 Mon Sep 17 00:00:00 2001 From: Qstick Date: Sun, 6 Jun 2021 12:57:28 -0400 Subject: [PATCH] Fixed: Cardigann redirect handling fails for relative location headers --- src/NzbDrone.Common/Http/HttpResponse.cs | 14 ++++++++++++++ .../Definitions/Cardigann/CardigannParser.cs | 2 +- .../Cardigann/CardigannRequestGenerator.cs | 4 ++-- .../PassThePopcorn/PassThePopcornParser.cs | 2 +- 4 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/NzbDrone.Common/Http/HttpResponse.cs b/src/NzbDrone.Common/Http/HttpResponse.cs index 9969c2bdc..181dc10d7 100644 --- a/src/NzbDrone.Common/Http/HttpResponse.cs +++ b/src/NzbDrone.Common/Http/HttpResponse.cs @@ -62,6 +62,20 @@ namespace NzbDrone.Common.Http StatusCode == HttpStatusCode.TemporaryRedirect || StatusCode == HttpStatusCode.Found; + public string RedirectUrl + { + get + { + var newUrl = Headers["Location"]; + if (newUrl == null || newUrl.IsNullOrWhiteSpace()) + { + return string.Empty; + } + + return (Request.Url += new HttpUri(newUrl)).FullUri; + } + } + public string[] GetCookieHeaders() { return Headers.GetValues("Set-Cookie") ?? Array.Empty(); diff --git a/src/NzbDrone.Core/Indexers/Definitions/Cardigann/CardigannParser.cs b/src/NzbDrone.Core/Indexers/Definitions/Cardigann/CardigannParser.cs index ab343f4d7..72b519276 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Cardigann/CardigannParser.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Cardigann/CardigannParser.cs @@ -36,7 +36,7 @@ namespace NzbDrone.Core.Indexers.Cardigann if (indexerResponse.HttpResponse.StatusCode != HttpStatusCode.OK) { // Remove cookie cache - if (indexerResponse.HttpResponse.HasHttpRedirect && indexerResponse.HttpResponse.Headers["Location"] + if (indexerResponse.HttpResponse.HasHttpRedirect && indexerResponse.HttpResponse.RedirectUrl .ContainsIgnoreCase("login.php")) { CookiesUpdater(null, null); diff --git a/src/NzbDrone.Core/Indexers/Definitions/Cardigann/CardigannRequestGenerator.cs b/src/NzbDrone.Core/Indexers/Definitions/Cardigann/CardigannRequestGenerator.cs index 17eadaf8b..9607289d3 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Cardigann/CardigannRequestGenerator.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Cardigann/CardigannRequestGenerator.cs @@ -635,14 +635,14 @@ namespace NzbDrone.Core.Indexers.Cardigann { if (requestUrl.StartsWith(SiteLink) && !redirectUrl.StartsWith(SiteLink)) { - var uri = new Uri(redirectUrl); + var uri = new HttpUri(redirectUrl); return uri.Scheme + "://" + uri.Host + "/"; } return null; } - protected string GetRedirectDomainHint(HttpResponse result) => GetRedirectDomainHint(result.Request.Url.ToString(), result.Headers.GetSingleValue("Location")); + protected string GetRedirectDomainHint(HttpResponse result) => GetRedirectDomainHint(result.Request.Url.ToString(), result.RedirectUrl); protected async Task HandleRequest(RequestBlock request, Dictionary variables = null, string referer = null) { diff --git a/src/NzbDrone.Core/Indexers/Definitions/PassThePopcorn/PassThePopcornParser.cs b/src/NzbDrone.Core/Indexers/Definitions/PassThePopcorn/PassThePopcornParser.cs index 1f575a8ed..778db934f 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/PassThePopcorn/PassThePopcornParser.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/PassThePopcorn/PassThePopcornParser.cs @@ -29,7 +29,7 @@ namespace NzbDrone.Core.Indexers.PassThePopcorn if (indexerResponse.HttpResponse.StatusCode != HttpStatusCode.OK) { // Remove cookie cache - if (indexerResponse.HttpResponse.HasHttpRedirect && indexerResponse.HttpResponse.Headers["Location"] + if (indexerResponse.HttpResponse.HasHttpRedirect && indexerResponse.HttpResponse.RedirectUrl .ContainsIgnoreCase("login.php")) { CookiesUpdater(null, null);