mirror of https://github.com/Sonarr/Sonarr
Fixed: Correctly handle 302 and 303 redirects in HttpClient
(cherry picked from commit ed7c5a937f4b50fcdf819e8fe347c8c0bc6bd2e7)
This commit is contained in:
parent
0e07d54ee7
commit
11bd764a75
|
@ -60,8 +60,7 @@ namespace NzbDrone.Common.Http
|
||||||
|
|
||||||
if (request.AllowAutoRedirect && response.HasHttpRedirect)
|
if (request.AllowAutoRedirect && response.HasHttpRedirect)
|
||||||
{
|
{
|
||||||
var autoRedirectChain = new List<string>();
|
var autoRedirectChain = new List<string> { request.Url.ToString() };
|
||||||
autoRedirectChain.Add(request.Url.ToString());
|
|
||||||
|
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
|
@ -75,6 +74,14 @@ namespace NzbDrone.Common.Http
|
||||||
throw new WebException($"Too many automatic redirections were attempted for {autoRedirectChain.Join(" -> ")}", WebExceptionStatus.ProtocolError);
|
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);
|
response = ExecuteRequest(request, cookieContainer);
|
||||||
}
|
}
|
||||||
while (response.HasHttpRedirect);
|
while (response.HasHttpRedirect);
|
||||||
|
@ -105,6 +112,16 @@ namespace NzbDrone.Common.Http
|
||||||
return response;
|
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)
|
private HttpResponse ExecuteRequest(HttpRequest request, CookieContainer cookieContainer)
|
||||||
{
|
{
|
||||||
foreach (var interceptor in _requestInterceptors)
|
foreach (var interceptor in _requestInterceptors)
|
||||||
|
|
Loading…
Reference in New Issue