Skip to content

Commit 78643b9

Browse files
authored
HttpWebRequest allow returning redirect response (#34560)
* HttpWebRequest allow returning redirect response Throw WebException for 3xx responses only when `AllowAutoRedirect = true` Fixes #1074 * Simplify status code check
1 parent 59a0eac commit 78643b9

File tree

2 files changed

+42
-1
lines changed

2 files changed

+42
-1
lines changed

src/libraries/System.Net.Requests/src/System/Net/HttpWebRequest.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1200,7 +1200,8 @@ private async Task<WebResponse> SendRequest()
12001200

12011201
HttpWebResponse response = new HttpWebResponse(responseMessage, _requestUri, _cookieContainer);
12021202

1203-
if (!responseMessage.IsSuccessStatusCode)
1203+
int maxSuccessStatusCode = AllowAutoRedirect ? 299 : 399;
1204+
if ((int)response.StatusCode > maxSuccessStatusCode || (int)response.StatusCode < 200)
12041205
{
12051206
throw new WebException(
12061207
SR.Format(SR.net_servererror, (int)response.StatusCode, response.StatusDescription),

src/libraries/System.Net.Requests/tests/HttpWebRequestTest.cs

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1197,6 +1197,46 @@ public void BeginGetResponse_CreatePostRequestThenAbort_ThrowsWebException(Uri r
11971197
Assert.Equal(WebExceptionStatus.RequestCanceled, ex.Status);
11981198
}
11991199

1200+
[Fact]
1201+
public async Task GetResponseAsync_AllowAutoRedirectTrueWithTooManyRedirects_ThrowsWebException()
1202+
{
1203+
await LoopbackServer.CreateClientAndServerAsync(async uri =>
1204+
{
1205+
HttpWebRequest request = WebRequest.CreateHttp(uri);
1206+
request.AllowAutoRedirect = true;
1207+
request.MaximumAutomaticRedirections = 1;
1208+
WebException ex = await Assert.ThrowsAsync<WebException>(async () => await request.GetResponseAsync());
1209+
Assert.Equal(WebExceptionStatus.ProtocolError, ex.Status);
1210+
}, server => server.HandleRequestAsync(HttpStatusCode.Redirect));
1211+
}
1212+
1213+
[Fact]
1214+
public async Task GetResponseAsync_AllowAutoRedirectFalseWithRedirect_ReturnsRedirectResponse()
1215+
{
1216+
await LoopbackServer.CreateClientAndServerAsync(async uri =>
1217+
{
1218+
HttpWebRequest request = WebRequest.CreateHttp(uri);
1219+
request.AllowAutoRedirect = false;
1220+
using (WebResponse response = await request.GetResponseAsync())
1221+
{
1222+
HttpWebResponse httpResponse = Assert.IsType<HttpWebResponse>(response);
1223+
Assert.Equal(HttpStatusCode.Redirect, httpResponse.StatusCode);
1224+
}
1225+
}, server => server.HandleRequestAsync(HttpStatusCode.Redirect));
1226+
}
1227+
1228+
[Fact]
1229+
public async Task GetResponseAsync_AllowAutoRedirectFalseWithBadRequest_ThrowsWebException()
1230+
{
1231+
await LoopbackServer.CreateClientAndServerAsync(async uri =>
1232+
{
1233+
HttpWebRequest request = WebRequest.CreateHttp(uri);
1234+
request.AllowAutoRedirect = false;
1235+
WebException ex = await Assert.ThrowsAsync<WebException>(async () => await request.GetResponseAsync());
1236+
Assert.Equal(WebExceptionStatus.ProtocolError, ex.Status);
1237+
}, server => server.HandleRequestAsync(HttpStatusCode.BadRequest));
1238+
}
1239+
12001240
[Fact]
12011241
public async Task GetRequestStreamAsync_WriteAndDisposeRequestStreamThenOpenRequestStream_ThrowsArgumentException()
12021242
{

0 commit comments

Comments
 (0)