Skip to content

Commit e05ec31

Browse files
committed
Merge pull request AsyncHttpClient#1045 from rodrigosetti/redirect-post-keep-content-type
Keep Content-Type when redirecting POST request with body
2 parents e17f8d9 + 6213e61 commit e05ec31

File tree

2 files changed

+30
-9
lines changed

2 files changed

+30
-9
lines changed

client/src/main/java/org/asynchttpclient/netty/handler/Protocol.java

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -83,12 +83,15 @@ public Protocol(ChannelManager channelManager, AsyncHttpClientConfig config, Net
8383

8484
public abstract void onClose(NettyResponseFuture<?> future);
8585

86-
private HttpHeaders propagatedHeaders(Request request, Realm realm, boolean switchToGet) {
86+
private HttpHeaders propagatedHeaders(Request request, Realm realm, boolean keepBody) {
8787

8888
HttpHeaders headers = request.getHeaders()//
8989
.remove(HttpHeaders.Names.HOST)//
90-
.remove(HttpHeaders.Names.CONTENT_LENGTH)//
91-
.remove(HttpHeaders.Names.CONTENT_TYPE);
90+
.remove(HttpHeaders.Names.CONTENT_LENGTH);
91+
92+
if (!keepBody) {
93+
headers.remove(HttpHeaders.Names.CONTENT_TYPE);
94+
}
9295

9396
if (realm != null && realm.getScheme() == AuthScheme.NTLM) {
9497
headers.remove(AUTHORIZATION)//
@@ -142,7 +145,7 @@ else if (request.getBodyGenerator() != null)
142145
requestBuilder.setBody(request.getBodyGenerator());
143146
}
144147

145-
requestBuilder.setHeaders(propagatedHeaders(request, realm, switchToGet));
148+
requestBuilder.setHeaders(propagatedHeaders(request, realm, keepBody));
146149

147150
// in case of a redirect from HTTP to HTTPS, future
148151
// attributes might change
@@ -161,7 +164,7 @@ else if (request.getBodyGenerator() != null)
161164
requestBuilder.addOrReplaceCookie(c);
162165
}
163166

164-
requestBuilder.setHeaders(propagatedHeaders(future.getCurrentRequest(), realm, switchToGet));
167+
requestBuilder.setHeaders(propagatedHeaders(future.getCurrentRequest(), realm, keepBody));
165168

166169
boolean sameBase = isSameBase(request.getUri(), newUri);
167170

client/src/test/java/org/asynchttpclient/RedirectBodyTest.java

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import static org.asynchttpclient.Dsl.*;
44
import static org.testng.Assert.assertEquals;
5+
import static org.testng.Assert.assertNull;
56

67
import java.io.IOException;
78
import java.util.concurrent.TimeUnit;
@@ -16,10 +17,18 @@
1617
import org.asynchttpclient.filter.ResponseFilter;
1718
import org.eclipse.jetty.server.Request;
1819
import org.eclipse.jetty.server.handler.AbstractHandler;
20+
import org.testng.annotations.BeforeMethod;
1921
import org.testng.annotations.Test;
2022

2123
public class RedirectBodyTest extends AbstractBasicTest {
2224

25+
private String receivedContentType;
26+
27+
@BeforeMethod
28+
public void setUp() throws Exception {
29+
receivedContentType = null;
30+
}
31+
2332
@Override
2433
public AbstractHandler configureHandler() throws Exception {
2534
return new AbstractHandler() {
@@ -41,6 +50,7 @@ public void handle(String pathInContext, Request request, HttpServletRequest htt
4150
IOUtils.read(request.getInputStream(), buffer);
4251
httpResponse.getOutputStream().write(buffer);
4352
}
53+
receivedContentType = request.getContentType();
4454
}
4555
httpResponse.getOutputStream().flush();
4656
httpResponse.getOutputStream().close();
@@ -60,39 +70,47 @@ public <T> FilterContext<T> filter(FilterContext<T> ctx) throws FilterException
6070
public void regular301LosesBody() throws Exception {
6171
try (AsyncHttpClient c = asyncHttpClient(config().setFollowRedirect(true).addResponseFilter(redirectOnce))) {
6272
String body = "hello there";
73+
String contentType = "text/plain";
6374

64-
Response response = c.preparePost(getTargetUrl()).setBody(body).setHeader("X-REDIRECT", "301").execute().get(TIMEOUT, TimeUnit.SECONDS);
75+
Response response = c.preparePost(getTargetUrl()).setHeader("Content-Type", contentType).setBody(body).setHeader("X-REDIRECT", "301").execute().get(TIMEOUT, TimeUnit.SECONDS);
6576
assertEquals(response.getResponseBody(), "");
77+
assertNull(receivedContentType);
6678
}
6779
}
6880

6981
@Test(groups = "standalone")
7082
public void regular302LosesBody() throws Exception {
7183
try (AsyncHttpClient c = asyncHttpClient(config().setFollowRedirect(true).addResponseFilter(redirectOnce))) {
7284
String body = "hello there";
85+
String contentType = "text/plain";
7386

74-
Response response = c.preparePost(getTargetUrl()).setBody(body).setHeader("X-REDIRECT", "302").execute().get(TIMEOUT, TimeUnit.SECONDS);
87+
Response response = c.preparePost(getTargetUrl()).setHeader("Content-Type", contentType).setBody(body).setHeader("X-REDIRECT", "302").execute().get(TIMEOUT, TimeUnit.SECONDS);
7588
assertEquals(response.getResponseBody(), "");
89+
assertNull(receivedContentType);
7690
}
7791
}
7892

7993
@Test(groups = "standalone")
8094
public void regular302StrictKeepsBody() throws Exception {
8195
try (AsyncHttpClient c = asyncHttpClient(config().setFollowRedirect(true).setStrict302Handling(true).addResponseFilter(redirectOnce))) {
8296
String body = "hello there";
97+
String contentType = "text/plain";
8398

84-
Response response = c.preparePost(getTargetUrl()).setBody(body).setHeader("X-REDIRECT", "302").execute().get(TIMEOUT, TimeUnit.SECONDS);
99+
Response response = c.preparePost(getTargetUrl()).setHeader("Content-Type", contentType).setBody(body).setHeader("X-REDIRECT", "302").execute().get(TIMEOUT, TimeUnit.SECONDS);
85100
assertEquals(response.getResponseBody(), body);
101+
assertEquals(receivedContentType, contentType);
86102
}
87103
}
88104

89105
@Test(groups = "standalone")
90106
public void regular307KeepsBody() throws Exception {
91107
try (AsyncHttpClient c = asyncHttpClient(config().setFollowRedirect(true).addResponseFilter(redirectOnce))) {
92108
String body = "hello there";
109+
String contentType = "text/plain";
93110

94-
Response response = c.preparePost(getTargetUrl()).setBody(body).setHeader("X-REDIRECT", "307").execute().get(TIMEOUT, TimeUnit.SECONDS);
111+
Response response = c.preparePost(getTargetUrl()).setHeader("Content-Type", contentType).setBody(body).setHeader("X-REDIRECT", "307").execute().get(TIMEOUT, TimeUnit.SECONDS);
95112
assertEquals(response.getResponseBody(), body);
113+
assertEquals(receivedContentType, contentType);
96114
}
97115
}
98116
}

0 commit comments

Comments
 (0)