25 uint redirectCount = 0u;
34 TraceError($
"Exceeded max number of redirects. Redirect from {request.RequestUri} to {uriForRedirect} blocked.", request.GetHashCode(),
"SendAsync");
39 request.Headers.Authorization =
null;
42 Trace($
"Redirecting from {request.RequestUri} to {uriForRedirect} in response to status code {httpResponseMessage.StatusCode} '{httpResponseMessage.StatusCode}'.", request.GetHashCode(),
"SendAsync");
44 request.RequestUri = uriForRedirect;
49 Trace($
"Modified request from {request.Method} to {HttpMethod.Get} in response to status code {httpResponseMessage.StatusCode} '{httpResponseMessage.StatusCode}'.", request.GetHashCode(),
"SendAsync");
52 request.Content =
null;
53 if (request.
Headers.TransferEncodingChunked ==
true)
55 request.Headers.TransferEncodingChunked =
false;
61 return httpResponseMessage;
67 if ((uint)(statusCode - 300) > 3u && (uint)(statusCode - 307) > 1u)
78 uri =
new Uri(requestUri, uri);
80 string fragment = requestUri.
Fragment;
81 if (!
string.IsNullOrEmpty(fragment))
84 if (
string.IsNullOrEmpty(fragment2))
96 TraceError($
"Insecure https to http redirect from '{requestUri}' to '{uri}' blocked.", response.
RequestMessage.GetHashCode(),
"GetUriForRedirect");
122 protected override void Dispose(
bool disposing)
129 base.Dispose(disposing);
132 internal void Trace(
string message,
int requestId, [CallerMemberName]
string memberName =
null)
137 internal void TraceError(
string message,
int requestId, [CallerMemberName]
string memberName =
null)
override Task< HttpResponseMessage > SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
virtual void Dispose(bool disposing)
HttpRequestHeaders Headers
HttpResponseHeaders Headers
HttpStatusCode StatusCode
virtual void Dispose(bool disposing)
HttpRequestMessage? RequestMessage
static bool IsSupportedSecureScheme(string scheme)
Uri GetUriForRedirect(Uri requestUri, HttpResponseMessage response)
override void Dispose(bool disposing)
void Trace(string message, int requestId, [CallerMemberName] string memberName=null)
override async ValueTask< HttpResponseMessage > SendAsync(HttpRequestMessage request, bool async, CancellationToken cancellationToken)
readonly HttpMessageHandlerStage _initialInnerHandler
readonly HttpMessageHandlerStage _redirectInnerHandler
static bool RequestRequiresForceGet(HttpStatusCode statusCode, HttpMethod requestMethod)
void TraceError(string message, int requestId, [CallerMemberName] string memberName=null)
RedirectHandler(int maxAutomaticRedirections, HttpMessageHandlerStage initialInnerHandler, HttpMessageHandlerStage redirectInnerHandler)
readonly int _maxAutomaticRedirections
static readonly System.Net.NetEventSource Log
new ConfiguredTaskAwaitable< TResult > ConfigureAwait(bool continueOnCapturedContext)