From 6213e61689e09b4ebb7d8c1506faac7c14c67fc2 Mon Sep 17 00:00:00 2001 From: Rodrigo Setti Date: Mon, 23 Nov 2015 13:10:48 -0800 Subject: [PATCH] Keep Content-Type when redirecting POST request For the POST redirects that keeps the body (302 strict and 307), also keep the Content-Type header. --- .../netty/handler/Protocol.java | 13 ++++++---- .../org/asynchttpclient/RedirectBodyTest.java | 26 ++++++++++++++++--- 2 files changed, 30 insertions(+), 9 deletions(-) diff --git a/client/src/main/java/org/asynchttpclient/netty/handler/Protocol.java b/client/src/main/java/org/asynchttpclient/netty/handler/Protocol.java index f1acb97215..9588a5c7a7 100755 --- a/client/src/main/java/org/asynchttpclient/netty/handler/Protocol.java +++ b/client/src/main/java/org/asynchttpclient/netty/handler/Protocol.java @@ -83,12 +83,15 @@ public Protocol(ChannelManager channelManager, AsyncHttpClientConfig config, Net public abstract void onClose(NettyResponseFuture future); - private HttpHeaders propagatedHeaders(Request request, Realm realm, boolean switchToGet) { + private HttpHeaders propagatedHeaders(Request request, Realm realm, boolean keepBody) { HttpHeaders headers = request.getHeaders()// .remove(HttpHeaders.Names.HOST)// - .remove(HttpHeaders.Names.CONTENT_LENGTH)// - .remove(HttpHeaders.Names.CONTENT_TYPE); + .remove(HttpHeaders.Names.CONTENT_LENGTH); + + if (!keepBody) { + headers.remove(HttpHeaders.Names.CONTENT_TYPE); + } if (realm != null && realm.getScheme() == AuthScheme.NTLM) { headers.remove(AUTHORIZATION)// @@ -142,7 +145,7 @@ else if (request.getBodyGenerator() != null) requestBuilder.setBody(request.getBodyGenerator()); } - requestBuilder.setHeaders(propagatedHeaders(request, realm, switchToGet)); + requestBuilder.setHeaders(propagatedHeaders(request, realm, keepBody)); // in case of a redirect from HTTP to HTTPS, future // attributes might change @@ -161,7 +164,7 @@ else if (request.getBodyGenerator() != null) requestBuilder.addOrReplaceCookie(c); } - requestBuilder.setHeaders(propagatedHeaders(future.getCurrentRequest(), realm, switchToGet)); + requestBuilder.setHeaders(propagatedHeaders(future.getCurrentRequest(), realm, keepBody)); boolean sameBase = isSameBase(request.getUri(), newUri); diff --git a/client/src/test/java/org/asynchttpclient/RedirectBodyTest.java b/client/src/test/java/org/asynchttpclient/RedirectBodyTest.java index 602d8b0e51..d406748bb5 100644 --- a/client/src/test/java/org/asynchttpclient/RedirectBodyTest.java +++ b/client/src/test/java/org/asynchttpclient/RedirectBodyTest.java @@ -2,6 +2,7 @@ import static org.asynchttpclient.Dsl.*; import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertNull; import java.io.IOException; import java.util.concurrent.TimeUnit; @@ -16,10 +17,18 @@ import org.asynchttpclient.filter.ResponseFilter; import org.eclipse.jetty.server.Request; import org.eclipse.jetty.server.handler.AbstractHandler; +import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; public class RedirectBodyTest extends AbstractBasicTest { + private String receivedContentType; + + @BeforeMethod + public void setUp() throws Exception { + receivedContentType = null; + } + @Override public AbstractHandler configureHandler() throws Exception { return new AbstractHandler() { @@ -41,6 +50,7 @@ public void handle(String pathInContext, Request request, HttpServletRequest htt IOUtils.read(request.getInputStream(), buffer); httpResponse.getOutputStream().write(buffer); } + receivedContentType = request.getContentType(); } httpResponse.getOutputStream().flush(); httpResponse.getOutputStream().close(); @@ -60,9 +70,11 @@ public FilterContext filter(FilterContext ctx) throws FilterException public void regular301LosesBody() throws Exception { try (AsyncHttpClient c = asyncHttpClient(config().setFollowRedirect(true).addResponseFilter(redirectOnce))) { String body = "hello there"; + String contentType = "text/plain"; - Response response = c.preparePost(getTargetUrl()).setBody(body).setHeader("X-REDIRECT", "301").execute().get(TIMEOUT, TimeUnit.SECONDS); + Response response = c.preparePost(getTargetUrl()).setHeader("Content-Type", contentType).setBody(body).setHeader("X-REDIRECT", "301").execute().get(TIMEOUT, TimeUnit.SECONDS); assertEquals(response.getResponseBody(), ""); + assertNull(receivedContentType); } } @@ -70,9 +82,11 @@ public void regular301LosesBody() throws Exception { public void regular302LosesBody() throws Exception { try (AsyncHttpClient c = asyncHttpClient(config().setFollowRedirect(true).addResponseFilter(redirectOnce))) { String body = "hello there"; + String contentType = "text/plain"; - Response response = c.preparePost(getTargetUrl()).setBody(body).setHeader("X-REDIRECT", "302").execute().get(TIMEOUT, TimeUnit.SECONDS); + Response response = c.preparePost(getTargetUrl()).setHeader("Content-Type", contentType).setBody(body).setHeader("X-REDIRECT", "302").execute().get(TIMEOUT, TimeUnit.SECONDS); assertEquals(response.getResponseBody(), ""); + assertNull(receivedContentType); } } @@ -80,9 +94,11 @@ public void regular302LosesBody() throws Exception { public void regular302StrictKeepsBody() throws Exception { try (AsyncHttpClient c = asyncHttpClient(config().setFollowRedirect(true).setStrict302Handling(true).addResponseFilter(redirectOnce))) { String body = "hello there"; + String contentType = "text/plain"; - Response response = c.preparePost(getTargetUrl()).setBody(body).setHeader("X-REDIRECT", "302").execute().get(TIMEOUT, TimeUnit.SECONDS); + Response response = c.preparePost(getTargetUrl()).setHeader("Content-Type", contentType).setBody(body).setHeader("X-REDIRECT", "302").execute().get(TIMEOUT, TimeUnit.SECONDS); assertEquals(response.getResponseBody(), body); + assertEquals(receivedContentType, contentType); } } @@ -90,9 +106,11 @@ public void regular302StrictKeepsBody() throws Exception { public void regular307KeepsBody() throws Exception { try (AsyncHttpClient c = asyncHttpClient(config().setFollowRedirect(true).addResponseFilter(redirectOnce))) { String body = "hello there"; + String contentType = "text/plain"; - Response response = c.preparePost(getTargetUrl()).setBody(body).setHeader("X-REDIRECT", "307").execute().get(TIMEOUT, TimeUnit.SECONDS); + Response response = c.preparePost(getTargetUrl()).setHeader("Content-Type", contentType).setBody(body).setHeader("X-REDIRECT", "307").execute().get(TIMEOUT, TimeUnit.SECONDS); assertEquals(response.getResponseBody(), body); + assertEquals(receivedContentType, contentType); } } }