Skip to content

Commit bf2bb02

Browse files
author
Stephane Landelle
committed
Filter headers propagated on redirect, close AsyncHttpClient#735
1 parent 4e3ca3f commit bf2bb02

File tree

1 file changed

+33
-0
lines changed
  • providers/netty/src/main/java/org/asynchttpclient/providers/netty/handler

1 file changed

+33
-0
lines changed

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

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,12 @@
1313
*/
1414
package org.asynchttpclient.providers.netty.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;
1622
import static io.netty.handler.codec.http.HttpResponseStatus.FOUND;
1723
import static io.netty.handler.codec.http.HttpResponseStatus.MOVED_PERMANENTLY;
1824
import static io.netty.handler.codec.http.HttpResponseStatus.SEE_OTHER;
@@ -26,10 +32,14 @@
2632

2733
import java.io.IOException;
2834
import java.util.HashSet;
35+
import java.util.List;
36+
import java.util.Locale;
37+
import java.util.Map;
2938
import java.util.Set;
3039

3140
import org.asynchttpclient.AsyncHandler;
3241
import org.asynchttpclient.AsyncHttpClientConfig;
42+
import org.asynchttpclient.FluentCaseInsensitiveStringsMap;
3343
import org.asynchttpclient.HttpResponseHeaders;
3444
import org.asynchttpclient.HttpResponseStatus;
3545
import org.asynchttpclient.MaxRedirectException;
@@ -72,6 +82,16 @@ public abstract class Protocol {
7282
REDIRECT_STATUSES.add(TEMPORARY_REDIRECT.code());
7383
}
7484

85+
public static final Set<String> PROPAGATED_ON_REDIRECT_HEADERS = new HashSet<String>();
86+
static {
87+
PROPAGATED_ON_REDIRECT_HEADERS.add(ACCEPT.toLowerCase(Locale.US));
88+
PROPAGATED_ON_REDIRECT_HEADERS.add(ACCEPT_CHARSET.toLowerCase(Locale.US));
89+
PROPAGATED_ON_REDIRECT_HEADERS.add(ACCEPT_ENCODING.toLowerCase(Locale.US));
90+
PROPAGATED_ON_REDIRECT_HEADERS.add(ACCEPT_LANGUAGE.toLowerCase(Locale.US));
91+
PROPAGATED_ON_REDIRECT_HEADERS.add(REFERER.toLowerCase(Locale.US));
92+
PROPAGATED_ON_REDIRECT_HEADERS.add(USER_AGENT.toLowerCase(Locale.US));
93+
}
94+
7595
public Protocol(ChannelManager channelManager, AsyncHttpClientConfig config, NettyAsyncHttpProviderConfig nettyConfig,
7696
NettyRequestSender requestSender) {
7797
this.channelManager = channelManager;
@@ -90,6 +110,17 @@ public Protocol(ChannelManager channelManager, AsyncHttpClientConfig config, Net
90110

91111
public abstract void onClose(NettyResponseFuture<?> future);
92112

113+
private FluentCaseInsensitiveStringsMap propagatedHeaders(Request request) {
114+
FluentCaseInsensitiveStringsMap redirectHeaders = new FluentCaseInsensitiveStringsMap();
115+
for (Map.Entry<String, List<String>> headerEntry : request.getHeaders()) {
116+
String headerName = headerEntry.getKey();
117+
List<String> headerValues = headerEntry.getValue();
118+
if (PROPAGATED_ON_REDIRECT_HEADERS.contains(headerName.toLowerCase(Locale.US)))
119+
redirectHeaders.add(headerName, headerValues);
120+
}
121+
return redirectHeaders;
122+
}
123+
93124
protected boolean exitAfterHandlingRedirect(//
94125
Channel channel,//
95126
NettyResponseFuture<?> future,//
@@ -138,6 +169,8 @@ protected boolean exitAfterHandlingRedirect(//
138169
requestBuilder.addOrReplaceCookie(c);
139170
}
140171

172+
requestBuilder.setHeaders(propagatedHeaders(future.getRequest()));
173+
141174
Callback callback = channelManager.newDrainCallback(future, channel, initialConnectionKeepAlive, initialPoolKey);
142175

143176
if (HttpHeaders.isTransferEncodingChunked(response)) {

0 commit comments

Comments
 (0)