protected override async Task<HttpResponseMessage> SendAsync(
HttpRequestMessage request,
CancellationToken cancellationToken)
{
if (request == null)
{
throw new ArgumentNullException(nameof(request));
}
_operationStarted = true;
var response = await SendInternalAsync(request, cancellationToken).NotOnCapturedContext();
var redirectCount = 0;
var statusCode = (int)response.StatusCode;
while (_allowAutoRedirect &&
(IsRedirectToGet(statusCode) ||
IsBodylessRequest(request) && statusCode == 307))
{
if(redirectCount >= _autoRedirectLimit)
{
throw new InvalidOperationException($"Too many redirects. Limit = {redirectCount}");
}
var location = response.Headers.Location;
if (!location.IsAbsoluteUri)
{
location = new Uri(response.RequestMessage.RequestUri, location);
}
var redirectMethod = IsRedirectToGet(statusCode) ? HttpMethod.Get : request.Method;
request.RequestUri = location;
request.Method = redirectMethod;
request.Headers.Authorization = null;
CheckSetCookie(request, response);
response = await SendInternalAsync(request, cancellationToken).NotOnCapturedContext();
statusCode = (int) response.StatusCode;
redirectCount++;
}
return response;
}