49
49
50
50
import java .io .IOException ;
51
51
import java .util .HashSet ;
52
- import java .util .List ;
53
- import java .util .Locale ;
54
- import java .util .Map ;
55
52
import java .util .Set ;
56
53
57
54
public abstract class Protocol {
@@ -75,16 +72,6 @@ public abstract class Protocol {
75
72
REDIRECT_STATUSES .add (TEMPORARY_REDIRECT .getCode ());
76
73
}
77
74
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
-
88
75
public Protocol (ChannelManager channelManager , AsyncHttpClientConfig config , NettyAsyncHttpProviderConfig nettyConfig ,
89
76
NettyRequestSender requestSender ) {
90
77
this .channelManager = channelManager ;
@@ -104,15 +91,14 @@ public Protocol(ChannelManager channelManager, AsyncHttpClientConfig config, Net
104
91
105
92
public abstract void onClose (NettyResponseFuture <?> future );
106
93
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 ;
116
102
}
117
103
118
104
protected boolean exitAfterHandlingRedirect (//
@@ -139,7 +125,8 @@ protected boolean exitAfterHandlingRedirect(//
139
125
140
126
// if we are to strictly handle 302, we should keep the original method (which browsers don't)
141
127
// 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 )
143
130
requestBuilder .setMethod ("GET" );
144
131
145
132
// in case of a redirect from HTTP to HTTPS, future attributes might change
@@ -160,7 +147,7 @@ protected boolean exitAfterHandlingRedirect(//
160
147
requestBuilder .addOrReplaceCookie (c );
161
148
}
162
149
163
- requestBuilder .setHeaders (propagatedHeaders (future .getRequest ()));
150
+ requestBuilder .setHeaders (propagatedHeaders (future .getRequest (), switchToGet ));
164
151
165
152
final Request nextRequest = requestBuilder .setUrl (newUrl ).build ();
166
153
0 commit comments