From d56f3ec2e774fb9f54a498afcba4b6bd89d1cc8f Mon Sep 17 00:00:00 2001 From: Qstick Date: Sat, 12 Jun 2021 16:24:48 -0400 Subject: [PATCH] Fixed: Correctly handle 302 and 303 redirects in HttpClient (cherry picked from commit ed7c5a937f4b50fcdf819e8fe347c8c0bc6bd2e7) (cherry picked from commit 11bd764a75d3b97117098738d3489c4b3329738f) --- src/NzbDrone.Common/Http/HttpClient.cs | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/src/NzbDrone.Common/Http/HttpClient.cs b/src/NzbDrone.Common/Http/HttpClient.cs index 175448e43..2824a8f94 100644 --- a/src/NzbDrone.Common/Http/HttpClient.cs +++ b/src/NzbDrone.Common/Http/HttpClient.cs @@ -60,8 +60,7 @@ namespace NzbDrone.Common.Http if (request.AllowAutoRedirect && response.HasHttpRedirect) { - var autoRedirectChain = new List(); - autoRedirectChain.Add(request.Url.ToString()); + var autoRedirectChain = new List { request.Url.ToString() }; do { @@ -75,6 +74,14 @@ namespace NzbDrone.Common.Http throw new WebException($"Too many automatic redirections were attempted for {autoRedirectChain.Join(" -> ")}", WebExceptionStatus.ProtocolError); } + // 302 or 303 should default to GET on redirect even if POST on original + if (RequestRequiresForceGet(response.StatusCode, response.Request.Method)) + { + request.Method = HttpMethod.Get; + request.ContentData = null; + request.ContentSummary = null; + } + response = ExecuteRequest(request, cookieContainer); } while (response.HasHttpRedirect); @@ -105,6 +112,16 @@ namespace NzbDrone.Common.Http return response; } + private static bool RequestRequiresForceGet(HttpStatusCode statusCode, HttpMethod requestMethod) + { + return statusCode switch + { + HttpStatusCode.Moved or HttpStatusCode.Found or HttpStatusCode.MultipleChoices => requestMethod == HttpMethod.Post, + HttpStatusCode.SeeOther => requestMethod != HttpMethod.Get && requestMethod != HttpMethod.Head, + _ => false, + }; + } + private HttpResponse ExecuteRequest(HttpRequest request, CookieContainer cookieContainer) { foreach (var interceptor in _requestInterceptors)