|
47 | 47 | import org.asynchttpclient.filter.FilterContext;
|
48 | 48 | import org.asynchttpclient.filter.FilterException;
|
49 | 49 | import org.asynchttpclient.filter.ResponseFilter;
|
50 |
| -import org.asynchttpclient.providers.netty3.Callback; |
51 | 50 | import org.asynchttpclient.providers.netty3.NettyAsyncHttpProviderConfig;
|
52 | 51 | import org.asynchttpclient.providers.netty3.channel.ChannelManager;
|
53 |
| -import org.asynchttpclient.providers.netty3.channel.Channels; |
54 | 52 | import org.asynchttpclient.providers.netty3.future.NettyResponseFuture;
|
55 | 53 | import org.asynchttpclient.providers.netty3.request.NettyRequestSender;
|
56 | 54 | import org.asynchttpclient.uri.Uri;
|
@@ -171,22 +169,28 @@ protected boolean exitAfterHandlingRedirect(//
|
171 | 169 |
|
172 | 170 | requestBuilder.setHeaders(propagatedHeaders(future.getRequest()));
|
173 | 171 |
|
174 |
| - Callback callback = channelManager.newDrainCallback(future, channel, initialConnectionKeepAlive, initialPoolKey); |
| 172 | + final Request nextRequest = requestBuilder.setUrl(newUrl).build(); |
| 173 | + |
| 174 | + logger.debug("Sending redirect to {}", request.getUri()); |
| 175 | + |
| 176 | + if (future.isKeepAlive() && !HttpHeaders.isTransferEncodingChunked(response) && !response.isChunked()) { |
| 177 | + |
| 178 | + boolean redirectToSameHost = request.getUri().getScheme().equals(nextRequest.getUri().getScheme()) |
| 179 | + && request.getUri().getHost().equals(nextRequest.getUri().getHost()) |
| 180 | + && request.getUri().getPort() == nextRequest.getUri().getPort(); |
| 181 | + |
| 182 | + if (redirectToSameHost) { |
| 183 | + future.setReuseChannel(true); |
| 184 | + } else { |
| 185 | + channelManager.drainChannelAndOffer(channel, future, initialConnectionKeepAlive, initialPoolKey); |
| 186 | + } |
175 | 187 |
|
176 |
| - if (HttpHeaders.isTransferEncodingChunked(response)) { |
177 |
| - // We must make sure there is no bytes left before |
178 |
| - // executing the next request. |
179 |
| - // FIXME investigate this |
180 |
| - Channels.setAttribute(channel, callback); |
181 | 188 | } else {
|
182 |
| - // FIXME don't understand: this offers the connection to the pool, or even closes it, while the |
183 |
| - // request has not been sent, right? |
184 |
| - callback.call(); |
| 189 | + // redirect + chunking = WAT |
| 190 | + channelManager.closeChannel(channel); |
185 | 191 | }
|
186 | 192 |
|
187 |
| - Request redirectRequest = requestBuilder.setUrl(newUrl).build(); |
188 |
| - // FIXME why not reuse the channel is same host? |
189 |
| - requestSender.sendNextRequest(redirectRequest, future); |
| 193 | + requestSender.sendNextRequest(nextRequest, future); |
190 | 194 | return true;
|
191 | 195 | }
|
192 | 196 | }
|
|
0 commit comments