Skip to content

Commit 1a245b2

Browse files
committed
Propagate most headers on redirect, close AsyncHttpClient#824
1 parent d95b3bf commit 1a245b2

File tree

1 file changed

+11
-24
lines changed
  • src/main/java/com/ning/http/client/providers/netty/handler

1 file changed

+11
-24
lines changed

src/main/java/com/ning/http/client/providers/netty/handler/Protocol.java

Lines changed: 11 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,6 @@
4949

5050
import java.io.IOException;
5151
import java.util.HashSet;
52-
import java.util.List;
53-
import java.util.Locale;
54-
import java.util.Map;
5552
import java.util.Set;
5653

5754
public abstract class Protocol {
@@ -75,16 +72,6 @@ public abstract class Protocol {
7572
REDIRECT_STATUSES.add(TEMPORARY_REDIRECT.getCode());
7673
}
7774

78-
public static final Set<String> PROPAGATED_ON_REDIRECT_HEADERS = new HashSet<>();
79-
static {
80-
PROPAGATED_ON_REDIRECT_HEADERS.add(ACCEPT.toLowerCase(Locale.US));
81-
PROPAGATED_ON_REDIRECT_HEADERS.add(ACCEPT_CHARSET.toLowerCase(Locale.US));
82-
PROPAGATED_ON_REDIRECT_HEADERS.add(ACCEPT_ENCODING.toLowerCase(Locale.US));
83-
PROPAGATED_ON_REDIRECT_HEADERS.add(ACCEPT_LANGUAGE.toLowerCase(Locale.US));
84-
PROPAGATED_ON_REDIRECT_HEADERS.add(REFERER.toLowerCase(Locale.US));
85-
PROPAGATED_ON_REDIRECT_HEADERS.add(USER_AGENT.toLowerCase(Locale.US));
86-
}
87-
8875
public Protocol(ChannelManager channelManager, AsyncHttpClientConfig config, NettyAsyncHttpProviderConfig nettyConfig,
8976
NettyRequestSender requestSender) {
9077
this.channelManager = channelManager;
@@ -104,15 +91,14 @@ public Protocol(ChannelManager channelManager, AsyncHttpClientConfig config, Net
10491

10592
public abstract void onClose(NettyResponseFuture<?> future);
10693

107-
private FluentCaseInsensitiveStringsMap propagatedHeaders(Request request) {
108-
FluentCaseInsensitiveStringsMap redirectHeaders = new FluentCaseInsensitiveStringsMap();
109-
for (Map.Entry<String, List<String>> headerEntry : request.getHeaders()) {
110-
String headerName = headerEntry.getKey();
111-
List<String> headerValues = headerEntry.getValue();
112-
if (PROPAGATED_ON_REDIRECT_HEADERS.contains(headerName.toLowerCase(Locale.US)))
113-
redirectHeaders.add(headerName, headerValues);
114-
}
115-
return redirectHeaders;
94+
private FluentCaseInsensitiveStringsMap propagatedHeaders(Request request, boolean switchToGet) {
95+
96+
FluentCaseInsensitiveStringsMap originalHeaders = request.getHeaders();
97+
originalHeaders.remove(HOST);
98+
originalHeaders.remove(CONTENT_LENGTH);
99+
if (switchToGet)
100+
originalHeaders.remove(CONTENT_TYPE);
101+
return originalHeaders;
116102
}
117103

118104
protected boolean exitAfterHandlingRedirect(//
@@ -139,7 +125,8 @@ protected boolean exitAfterHandlingRedirect(//
139125

140126
// if we are to strictly handle 302, we should keep the original method (which browsers don't)
141127
// 303 must force GET
142-
if ((statusCode == FOUND.getCode() && !config.isStrict302Handling()) || statusCode == SEE_OTHER.getCode())
128+
boolean switchToGet = !request.getMethod().equals("GET") && (statusCode == 303 || (statusCode == 302 && !config.isStrict302Handling()));
129+
if (switchToGet)
143130
requestBuilder.setMethod("GET");
144131

145132
// in case of a redirect from HTTP to HTTPS, future attributes might change
@@ -160,7 +147,7 @@ protected boolean exitAfterHandlingRedirect(//
160147
requestBuilder.addOrReplaceCookie(c);
161148
}
162149

163-
requestBuilder.setHeaders(propagatedHeaders(future.getRequest()));
150+
requestBuilder.setHeaders(propagatedHeaders(future.getRequest(), switchToGet));
164151

165152
final Request nextRequest = requestBuilder.setUrl(newUrl).build();
166153

0 commit comments

Comments
 (0)