Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
RedirectHandler.cs
Go to the documentation of this file.
4
5namespace System.Net.Http;
6
8{
10
12
13 private readonly int _maxAutomaticRedirections;
14
15 public RedirectHandler(int maxAutomaticRedirections, HttpMessageHandlerStage initialInnerHandler, HttpMessageHandlerStage redirectInnerHandler)
16 {
17 _maxAutomaticRedirections = maxAutomaticRedirections;
18 _initialInnerHandler = initialInnerHandler;
19 _redirectInnerHandler = redirectInnerHandler;
20 }
21
23 {
24 HttpResponseMessage httpResponseMessage = await _initialInnerHandler.SendAsync(request, async, cancellationToken).ConfigureAwait(continueOnCapturedContext: false);
25 uint redirectCount = 0u;
26 Uri uriForRedirect;
27 while ((uriForRedirect = GetUriForRedirect(request.RequestUri, httpResponseMessage)) != null)
28 {
29 redirectCount++;
30 if (redirectCount > _maxAutomaticRedirections)
31 {
32 if (System.Net.NetEventSource.Log.IsEnabled())
33 {
34 TraceError($"Exceeded max number of redirects. Redirect from {request.RequestUri} to {uriForRedirect} blocked.", request.GetHashCode(), "SendAsync");
35 }
36 break;
37 }
38 httpResponseMessage.Dispose();
39 request.Headers.Authorization = null;
40 if (System.Net.NetEventSource.Log.IsEnabled())
41 {
42 Trace($"Redirecting from {request.RequestUri} to {uriForRedirect} in response to status code {httpResponseMessage.StatusCode} '{httpResponseMessage.StatusCode}'.", request.GetHashCode(), "SendAsync");
43 }
44 request.RequestUri = uriForRedirect;
45 if (RequestRequiresForceGet(httpResponseMessage.StatusCode, request.Method))
46 {
47 if (System.Net.NetEventSource.Log.IsEnabled())
48 {
49 Trace($"Modified request from {request.Method} to {HttpMethod.Get} in response to status code {httpResponseMessage.StatusCode} '{httpResponseMessage.StatusCode}'.", request.GetHashCode(), "SendAsync");
50 }
51 request.Method = HttpMethod.Get;
52 request.Content = null;
53 if (request.Headers.TransferEncodingChunked == true)
54 {
55 request.Headers.TransferEncodingChunked = false;
56 }
57 }
58 request.MarkAsRedirected();
59 httpResponseMessage = await _redirectInnerHandler.SendAsync(request, async, cancellationToken).ConfigureAwait(continueOnCapturedContext: false);
60 }
61 return httpResponseMessage;
62 }
63
64 private Uri GetUriForRedirect(Uri requestUri, HttpResponseMessage response)
65 {
66 HttpStatusCode statusCode = response.StatusCode;
67 if ((uint)(statusCode - 300) > 3u && (uint)(statusCode - 307) > 1u)
68 {
69 return null;
70 }
71 Uri uri = response.Headers.Location;
72 if (uri == null)
73 {
74 return null;
75 }
76 if (!uri.IsAbsoluteUri)
77 {
78 uri = new Uri(requestUri, uri);
79 }
80 string fragment = requestUri.Fragment;
81 if (!string.IsNullOrEmpty(fragment))
82 {
83 string fragment2 = uri.Fragment;
84 if (string.IsNullOrEmpty(fragment2))
85 {
86 uri = new UriBuilder(uri)
87 {
88 Fragment = fragment
89 }.Uri;
90 }
91 }
93 {
94 if (System.Net.NetEventSource.Log.IsEnabled())
95 {
96 TraceError($"Insecure https to http redirect from '{requestUri}' to '{uri}' blocked.", response.RequestMessage.GetHashCode(), "GetUriForRedirect");
97 }
98 return null;
99 }
100 return uri;
101 }
102
103 private static bool RequestRequiresForceGet(HttpStatusCode statusCode, HttpMethod requestMethod)
104 {
105 switch (statusCode)
106 {
107 case HttpStatusCode.MultipleChoices:
108 case HttpStatusCode.MovedPermanently:
109 case HttpStatusCode.Found:
110 return requestMethod == HttpMethod.Post;
111 case HttpStatusCode.SeeOther:
112 if (requestMethod != HttpMethod.Get)
113 {
114 return requestMethod != HttpMethod.Head;
115 }
116 return false;
117 default:
118 return false;
119 }
120 }
121
122 protected override void Dispose(bool disposing)
123 {
124 if (disposing)
125 {
128 }
129 base.Dispose(disposing);
130 }
131
132 internal void Trace(string message, int requestId, [CallerMemberName] string memberName = null)
133 {
134 System.Net.NetEventSource.Log.HandlerMessage(0, 0, requestId, memberName, ToString() + ": " + message);
135 }
136
137 internal void TraceError(string message, int requestId, [CallerMemberName] string memberName = null)
138 {
139 System.Net.NetEventSource.Log.HandlerMessageError(0, 0, requestId, memberName, ToString() + ": " + message);
140 }
141}
override Task< HttpResponseMessage > SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
virtual void Dispose(bool disposing)
static HttpMethod Head
Definition HttpMethod.cs:43
static HttpMethod Get
Definition HttpMethod.cs:35
static HttpMethod Post
Definition HttpMethod.cs:39
virtual void Dispose(bool disposing)
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)
static readonly System.Net.NetEventSource Log
new ConfiguredTaskAwaitable< TResult > ConfigureAwait(bool continueOnCapturedContext)
Definition Task.cs:226
bool IsAbsoluteUri
Definition Uri.cs:572
string Scheme
Definition Uri.cs:505
string Fragment
Definition Uri.cs:491