Skip to content

Commit 29f21d9

Browse files
committed
Improvements (and corrections on some tiny merge errors during) based on rebasing...
1 parent a4ce540 commit 29f21d9

File tree

3 files changed

+21
-27
lines changed

3 files changed

+21
-27
lines changed

src/RestSharp/Options/RestClientRedirectionOptions.cs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ public class RestClientRedirectionOptions {
2121
/// redirect from HTTPS to HTTP.
2222
/// </summary>
2323
public bool FollowRedirectsToInsecure { get; set; } = false;
24+
2425
/// <summary>
2526
/// Set to true (default), when you want to include the originally
2627
/// requested headers in redirected requests.
@@ -32,8 +33,9 @@ public class RestClientRedirectionOptions {
3233
/// Authorization header to the redirected destination.
3334
/// </summary>
3435
public bool ForwardAuthorization { get; set; } = false;
36+
3537
/// <summary>
36-
/// Set to true (default), when you want to include cookie3s from the
38+
/// Set to true (default), when you want to include cookies from the
3739
/// CookieContainer on the redirected URL.
3840
/// </summary>
3941
/// <remarks>
@@ -88,6 +90,13 @@ public class RestClientRedirectionOptions {
8890
/// fragment should inherit the fragment from the original URI.
8991
/// </remarks>
9092
public bool ForwardFragment { get; set; } = true;
93+
94+
/// <summary>
95+
/// Set to true (default), to allow the HTTP Method used on the original request to
96+
/// be replaced with GET when the status code 303 (HttpStatusCode.RedirectMethod)
97+
/// was returned. Setting this to false will disallow the altering of the verb.
98+
/// </summary>
99+
public bool AllowRedirectMethodStatusCodeToAlterVerb { get; set; } = true;
91100

92101
/// <summary>
93102
/// HttpStatusCodes that trigger redirect processing. Defaults to MovedPermanently (301),

src/RestSharp/RestClient.Async.cs

Lines changed: 11 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -94,26 +94,12 @@ async Task<HttpResponse> ExecuteRequestAsync(RestRequest request, CancellationTo
9494
using var cts = CancellationTokenSource.CreateLinkedTokenSource(timeoutCts.Token, cancellationToken);
9595

9696
var ct = cts.Token;
97-
98-
99-
HttpResponseMessage? responseMessage;
100-
// Make sure we have a cookie container if not provided in the request
101-
CookieContainer cookieContainer = request.CookieContainer ??= new CookieContainer();
10297

103-
var headers = new RequestHeaders()
104-
.AddHeaders(request.Parameters)
105-
.AddHeaders(DefaultParameters)
106-
.AddAcceptHeader(AcceptedContentTypes)
107-
.AddCookieHeaders(url, cookieContainer)
108-
.AddCookieHeaders(url, Options.CookieContainer);
98+
HttpResponseMessage? responseMessage = null;
99+
var cookieContainer = request.CookieContainer ??= new CookieContainer();
109100

110-
message.AddHeaders(headers);
111-
if (request.OnBeforeRequest != null) await request.OnBeforeRequest(message).ConfigureAwait(false);
112-
await OnBeforeRequest(message).ConfigureAwait(false);
113-
114101
try {
115102
// Make sure we have a cookie container if not provided in the request
116-
var cookieContainer = request.CookieContainer ??= new CookieContainer();
117103

118104
var headers = new RequestHeaders()
119105
.AddHeaders(request.Parameters)
@@ -123,7 +109,6 @@ async Task<HttpResponse> ExecuteRequestAsync(RestRequest request, CancellationTo
123109
.AddCookieHeaders(url, Options.CookieContainer);
124110

125111
bool foundCookies = false;
126-
HttpResponseMessage? responseMessage = null;
127112

128113
do {
129114
using var requestContent = new RequestContent(this, request);
@@ -137,10 +122,12 @@ async Task<HttpResponse> ExecuteRequestAsync(RestRequest request, CancellationTo
137122
using var message = PrepareRequestMessage(httpMethod, url, content, headers);
138123

139124
if (request.OnBeforeRequest != null) await request.OnBeforeRequest(message).ConfigureAwait(false);
125+
await OnBeforeRequest(message).ConfigureAwait(false);
140126

141127
responseMessage = await HttpClient.SendAsync(message, request.CompletionOption, ct).ConfigureAwait(false);
142128

143129
if (request.OnAfterRequest != null) await request.OnAfterRequest(responseMessage).ConfigureAwait(false);
130+
await OnAfterRequest(responseMessage).ConfigureAwait(false);
144131

145132
if (!IsRedirect(Options.RedirectOptions, responseMessage)) {
146133
break;
@@ -171,15 +158,17 @@ async Task<HttpResponse> ExecuteRequestAsync(RestRequest request, CancellationTo
171158

172159
// Disallow automatic redirection from secure to non-secure schemes
173160
// based on the option setting:
174-
if (HttpUtilities.IsSupportedSecureScheme(requestUri.Scheme)
161+
if (HttpUtilities.IsSupportedSecureScheme(originalUrl.Scheme)
175162
&& !HttpUtilities.IsSupportedSecureScheme(location.Scheme)
176163
&& !Options.RedirectOptions.FollowRedirectsToInsecure) {
177164
// TODO: Log here...
178165
break;
179166
}
180167

181-
if (responseMessage.StatusCode == HttpStatusCode.RedirectMethod) {
182-
// TODO: Add RedirectionOptions property for this decision:
168+
// This is the expected behavior for this status code, but
169+
// ignore it if requested from the RedirectOptions:
170+
if (responseMessage.StatusCode == HttpStatusCode.RedirectMethod
171+
&& Options.RedirectOptions.AllowRedirectMethodStatusCodeToAlterVerb) {
183172
httpMethod = HttpMethod.Get;
184173
}
185174

@@ -199,10 +188,8 @@ async Task<HttpResponse> ExecuteRequestAsync(RestRequest request, CancellationTo
199188
if (!Options.RedirectOptions.ForceForwardBody) {
200189
// HttpClient RedirectHandler sets request.Content to null here:
201190
message.Content = null;
202-
// HttpClient Redirect handler also does this:
203-
//if (message.Headers.TansferEncodingChunked == true) {
204-
// request.Headers.TransferEncodingChunked = false;
205-
//}
191+
// HttpClient Redirect handler also foribly removes
192+
// a Transfer-Encoding of chunked in this case.
206193
Parameter? transferEncoding = request.Parameters.TryFind(KnownHeaders.TransferEncoding);
207194
if (transferEncoding != null
208195
&& transferEncoding.Type == ParameterType.HttpHeader
@@ -237,7 +224,6 @@ async Task<HttpResponse> ExecuteRequestAsync(RestRequest request, CancellationTo
237224
if (request.OnAfterRequest != null) await request.OnAfterRequest(responseMessage).ConfigureAwait(false);
238225
await OnAfterRequest(responseMessage).ConfigureAwait(false);
239226
return new HttpResponse(responseMessage, url, cookieContainer, null, timeoutCts.Token);
240-
241227
}
242228

243229
/// <summary>

test/RestSharp.Tests.Integrated/Server/TestServer.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@ public HttpServer(ITestOutputHelper? output = null) {
3838
_app.MapGet("headers", HeaderHandlers.HandleHeaders);
3939
_app.MapGet("request-echo", async context => await context.Request.BodyReader.AsStream().CopyToAsync(context.Response.BodyWriter.AsStream()));
4040
_app.MapDelete("delete", () => new TestResponse { Message = "Works!" });
41-
_app.MapGet("redirect", () => Results.Redirect("/success", false, true));
4241

4342
// Cookies
4443
_app.MapGet("get-cookies", CookieHandlers.HandleCookies);

0 commit comments

Comments
 (0)