Skip to content

Commit f46ed2f

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

File tree

2 files changed

+24
-55
lines changed
  • providers
    • netty3/src/main/java/org/asynchttpclient/providers/netty3/handler
    • netty4/src/main/java/org/asynchttpclient/providers/netty4/handler

2 files changed

+24
-55
lines changed

providers/netty3/src/main/java/org/asynchttpclient/providers/netty3/handler/Protocol.java

Lines changed: 12 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,7 @@
1616
import static org.asynchttpclient.providers.netty.commons.util.HttpUtils.HTTP;
1717
import static org.asynchttpclient.providers.netty.commons.util.HttpUtils.WEBSOCKET;
1818
import static org.asynchttpclient.util.AsyncHttpProviderUtils.followRedirect;
19-
import static org.jboss.netty.handler.codec.http.HttpHeaders.Names.ACCEPT;
20-
import static org.jboss.netty.handler.codec.http.HttpHeaders.Names.ACCEPT_CHARSET;
21-
import static org.jboss.netty.handler.codec.http.HttpHeaders.Names.ACCEPT_ENCODING;
22-
import static org.jboss.netty.handler.codec.http.HttpHeaders.Names.ACCEPT_LANGUAGE;
23-
import static org.jboss.netty.handler.codec.http.HttpHeaders.Names.REFERER;
24-
import static org.jboss.netty.handler.codec.http.HttpHeaders.Names.USER_AGENT;
19+
import static org.jboss.netty.handler.codec.http.HttpHeaders.Names.*;
2520
import static org.jboss.netty.handler.codec.http.HttpResponseStatus.FOUND;
2621
import static org.jboss.netty.handler.codec.http.HttpResponseStatus.MOVED_PERMANENTLY;
2722
import static org.jboss.netty.handler.codec.http.HttpResponseStatus.SEE_OTHER;
@@ -79,16 +74,6 @@ public abstract class Protocol {
7974
REDIRECT_STATUSES.add(TEMPORARY_REDIRECT.getCode());
8075
}
8176

82-
public static final Set<String> PROPAGATED_ON_REDIRECT_HEADERS = new HashSet<>();
83-
static {
84-
PROPAGATED_ON_REDIRECT_HEADERS.add(ACCEPT.toLowerCase(Locale.US));
85-
PROPAGATED_ON_REDIRECT_HEADERS.add(ACCEPT_CHARSET.toLowerCase(Locale.US));
86-
PROPAGATED_ON_REDIRECT_HEADERS.add(ACCEPT_ENCODING.toLowerCase(Locale.US));
87-
PROPAGATED_ON_REDIRECT_HEADERS.add(ACCEPT_LANGUAGE.toLowerCase(Locale.US));
88-
PROPAGATED_ON_REDIRECT_HEADERS.add(REFERER.toLowerCase(Locale.US));
89-
PROPAGATED_ON_REDIRECT_HEADERS.add(USER_AGENT.toLowerCase(Locale.US));
90-
}
91-
9277
public Protocol(ChannelManager channelManager, AsyncHttpClientConfig config, NettyAsyncHttpProviderConfig nettyConfig,
9378
NettyRequestSender requestSender) {
9479
this.channelManager = channelManager;
@@ -108,15 +93,14 @@ public Protocol(ChannelManager channelManager, AsyncHttpClientConfig config, Net
10893

10994
public abstract void onClose(NettyResponseFuture<?> future);
11095

111-
private FluentCaseInsensitiveStringsMap propagatedHeaders(Request request) {
112-
FluentCaseInsensitiveStringsMap redirectHeaders = new FluentCaseInsensitiveStringsMap();
113-
for (Map.Entry<String, List<String>> headerEntry : request.getHeaders()) {
114-
String headerName = headerEntry.getKey();
115-
List<String> headerValues = headerEntry.getValue();
116-
if (PROPAGATED_ON_REDIRECT_HEADERS.contains(headerName.toLowerCase(Locale.US)))
117-
redirectHeaders.add(headerName, headerValues);
118-
}
119-
return redirectHeaders;
96+
private FluentCaseInsensitiveStringsMap propagatedHeaders(Request request, boolean switchToGet) {
97+
98+
FluentCaseInsensitiveStringsMap originalHeaders = request.getHeaders();
99+
originalHeaders.remove(HOST);
100+
originalHeaders.remove(CONTENT_LENGTH);
101+
if (switchToGet)
102+
originalHeaders.remove(CONTENT_TYPE);
103+
return originalHeaders;
120104
}
121105

122106
protected boolean exitAfterHandlingRedirect(//
@@ -143,9 +127,9 @@ protected boolean exitAfterHandlingRedirect(//
143127

144128
// if we are to strictly handle 302, we should keep the original method (which browsers don't)
145129
// 303 must force GET
146-
if ((statusCode == FOUND.getCode() && !config.isStrict302Handling()) || statusCode == SEE_OTHER.getCode())
130+
boolean switchToGet = !request.getMethod().equals("GET") && (statusCode == 303 || (statusCode == 302 && !config.isStrict302Handling()));
131+
if (switchToGet)
147132
requestBuilder.setMethod("GET");
148-
149133
// in case of a redirect from HTTP to HTTPS, future attributes might change
150134
final boolean initialConnectionKeepAlive = future.isKeepAlive();
151135
final String initialPartition = future.getPartitionId();
@@ -164,7 +148,7 @@ protected boolean exitAfterHandlingRedirect(//
164148
requestBuilder.addOrReplaceCookie(c);
165149
}
166150

167-
requestBuilder.setHeaders(propagatedHeaders(future.getRequest()));
151+
requestBuilder.setHeaders(propagatedHeaders(future.getRequest(), switchToGet));
168152

169153
final Request nextRequest = requestBuilder.setUrl(newUrl).build();
170154

providers/netty4/src/main/java/org/asynchttpclient/providers/netty4/handler/Protocol.java

Lines changed: 12 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,7 @@
1313
*/
1414
package org.asynchttpclient.providers.netty4.handler;
1515

16-
import static io.netty.handler.codec.http.HttpHeaders.Names.ACCEPT;
17-
import static io.netty.handler.codec.http.HttpHeaders.Names.ACCEPT_CHARSET;
18-
import static io.netty.handler.codec.http.HttpHeaders.Names.ACCEPT_ENCODING;
19-
import static io.netty.handler.codec.http.HttpHeaders.Names.ACCEPT_LANGUAGE;
20-
import static io.netty.handler.codec.http.HttpHeaders.Names.REFERER;
21-
import static io.netty.handler.codec.http.HttpHeaders.Names.USER_AGENT;
16+
import static io.netty.handler.codec.http.HttpHeaders.Names.*;
2217
import static io.netty.handler.codec.http.HttpResponseStatus.FOUND;
2318
import static io.netty.handler.codec.http.HttpResponseStatus.MOVED_PERMANENTLY;
2419
import static io.netty.handler.codec.http.HttpResponseStatus.SEE_OTHER;
@@ -79,16 +74,6 @@ public abstract class Protocol {
7974
REDIRECT_STATUSES.add(TEMPORARY_REDIRECT.code());
8075
}
8176

82-
public static final Set<String> PROPAGATED_ON_REDIRECT_HEADERS = new HashSet<>();
83-
static {
84-
PROPAGATED_ON_REDIRECT_HEADERS.add(ACCEPT.toLowerCase(Locale.US));
85-
PROPAGATED_ON_REDIRECT_HEADERS.add(ACCEPT_CHARSET.toLowerCase(Locale.US));
86-
PROPAGATED_ON_REDIRECT_HEADERS.add(ACCEPT_ENCODING.toLowerCase(Locale.US));
87-
PROPAGATED_ON_REDIRECT_HEADERS.add(ACCEPT_LANGUAGE.toLowerCase(Locale.US));
88-
PROPAGATED_ON_REDIRECT_HEADERS.add(REFERER.toLowerCase(Locale.US));
89-
PROPAGATED_ON_REDIRECT_HEADERS.add(USER_AGENT.toLowerCase(Locale.US));
90-
}
91-
9277
public Protocol(ChannelManager channelManager, AsyncHttpClientConfig config, NettyAsyncHttpProviderConfig nettyConfig,
9378
NettyRequestSender requestSender) {
9479
this.channelManager = channelManager;
@@ -108,15 +93,14 @@ public Protocol(ChannelManager channelManager, AsyncHttpClientConfig config, Net
10893

10994
public abstract void onClose(NettyResponseFuture<?> future);
11095

111-
private FluentCaseInsensitiveStringsMap propagatedHeaders(Request request) {
112-
FluentCaseInsensitiveStringsMap redirectHeaders = new FluentCaseInsensitiveStringsMap();
113-
for (Map.Entry<String, List<String>> headerEntry : request.getHeaders()) {
114-
String headerName = headerEntry.getKey();
115-
List<String> headerValues = headerEntry.getValue();
116-
if (PROPAGATED_ON_REDIRECT_HEADERS.contains(headerName.toLowerCase(Locale.US)))
117-
redirectHeaders.add(headerName, headerValues);
118-
}
119-
return redirectHeaders;
96+
private FluentCaseInsensitiveStringsMap propagatedHeaders(Request request, boolean switchToGet) {
97+
98+
FluentCaseInsensitiveStringsMap originalHeaders = request.getHeaders();
99+
originalHeaders.remove(HOST);
100+
originalHeaders.remove(CONTENT_LENGTH);
101+
if (switchToGet)
102+
originalHeaders.remove(CONTENT_TYPE);
103+
return originalHeaders;
120104
}
121105

122106
protected boolean exitAfterHandlingRedirect(//
@@ -143,7 +127,8 @@ protected boolean exitAfterHandlingRedirect(//
143127

144128
// if we are to strictly handle 302, we should keep the original method (which browsers don't)
145129
// 303 must force GET
146-
if ((statusCode == FOUND.code() && !config.isStrict302Handling()) || statusCode == SEE_OTHER.code())
130+
boolean switchToGet = !request.getMethod().equals("GET") && (statusCode == 303 || (statusCode == 302 && !config.isStrict302Handling()));
131+
if (switchToGet)
147132
requestBuilder.setMethod("GET");
148133

149134
// in case of a redirect from HTTP to HTTPS, future attributes might change
@@ -164,7 +149,7 @@ protected boolean exitAfterHandlingRedirect(//
164149
requestBuilder.addOrReplaceCookie(c);
165150
}
166151

167-
requestBuilder.setHeaders(propagatedHeaders(future.getRequest()));
152+
requestBuilder.setHeaders(propagatedHeaders(future.getRequest(), switchToGet));
168153

169154
final Request nextRequest = requestBuilder.setUrl(newUrl).build();
170155

0 commit comments

Comments
 (0)