Skip to content

Commit bce107d

Browse files
author
Stephane Landelle
committed
Share applyResponseFiltersAndReplayRequest method for WS too
1 parent e7c7a83 commit bce107d

File tree

4 files changed

+63
-76
lines changed

4 files changed

+63
-76
lines changed

api/src/main/java/org/asynchttpclient/AsyncHttpClient.java

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -581,20 +581,16 @@ public ListenableFuture<Response> executeRequest(Request request) throws IOExcep
581581
* @return {@link FilterContext}
582582
*/
583583
private <T> FilterContext<T> preProcessRequest(FilterContext<T> fc) throws IOException {
584-
if (config.hasRequestFilters()) {
585-
final List<RequestFilter> requestFilters = config.getRequestFilters();
586-
for (int i = 0, len = requestFilters.size(); i < len; i++) {
587-
final RequestFilter asyncFilter = requestFilters.get(i);
588-
try {
589-
fc = asyncFilter.filter(fc);
590-
if (fc == null) {
591-
throw new NullPointerException("FilterContext is null");
592-
}
593-
} catch (FilterException e) {
594-
IOException ex = new IOException();
595-
ex.initCause(e);
596-
throw ex;
584+
for (RequestFilter asyncFilter: config.getRequestFilters()) {
585+
try {
586+
fc = asyncFilter.filter(fc);
587+
if (fc == null) {
588+
throw new NullPointerException("FilterContext is null");
597589
}
590+
} catch (FilterException e) {
591+
IOException ex = new IOException();
592+
ex.initCause(e);
593+
throw ex;
598594
}
599595
}
600596

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

Lines changed: 2 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@
6363
import org.slf4j.LoggerFactory;
6464

6565
final class HttpProtocol extends Protocol {
66-
66+
6767
private static final Logger LOGGER = LoggerFactory.getLogger(HttpProtocol.class);
6868

6969
public HttpProtocol(Channels channels, AsyncHttpClientConfig config, NettyAsyncHttpProviderConfig nettyConfig, NettyRequestSender requestSender) {
@@ -212,36 +212,6 @@ private void markAsDone(NettyResponseFuture<?> future, final ChannelHandlerConte
212212
}
213213
}
214214

215-
private boolean applyResponseFiltersAndReplayRequest(ChannelHandlerContext ctx, NettyResponseFuture<?> future, HttpResponseStatus status, HttpResponseHeaders responseHeaders)
216-
throws IOException {
217-
218-
AsyncHandler handler = future.getAsyncHandler();
219-
FilterContext fc = new FilterContext.FilterContextBuilder().asyncHandler(handler).request(future.getRequest()).responseStatus(status).responseHeaders(responseHeaders)
220-
.build();
221-
222-
for (ResponseFilter asyncFilter : config.getResponseFilters()) {
223-
try {
224-
fc = asyncFilter.filter(fc);
225-
// FIXME Is it worth protecting against this?
226-
if (fc == null) {
227-
throw new NullPointerException("FilterContext is null");
228-
}
229-
} catch (FilterException efe) {
230-
channels.abort(future, efe);
231-
}
232-
}
233-
234-
// The handler may have been wrapped.
235-
future.setAsyncHandler(fc.getAsyncHandler());
236-
237-
// The request has changed
238-
if (fc.replayRequest()) {
239-
requestSender.replayRequest(future, fc, ctx);
240-
return true;
241-
}
242-
return false;
243-
}
244-
245215
private boolean handleResponseAndExit(final ChannelHandlerContext ctx, final NettyResponseFuture<?> future, AsyncHandler<?> handler, HttpRequest nettyRequest,
246216
ProxyServer proxyServer, HttpResponse response) throws Exception {
247217
Request request = future.getRequest();
@@ -258,7 +228,7 @@ private boolean handleResponseAndExit(final ChannelHandlerContext ctx, final Net
258228

259229
future.setKeepAlive(!HttpHeaders.Values.CLOSE.equalsIgnoreCase(response.headers().get(HttpHeaders.Names.CONNECTION)));
260230

261-
if (!config.getResponseFilters().isEmpty() && applyResponseFiltersAndReplayRequest(ctx, future, status, responseHeaders)) {
231+
if (applyResponseFiltersAndReplayRequest(ctx, future, status, responseHeaders)) {
262232
return true;
263233
}
264234

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

Lines changed: 43 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,20 @@
1919
import io.netty.handler.codec.http.HttpMethod;
2020
import io.netty.handler.codec.http.HttpResponse;
2121

22+
import java.io.IOException;
2223
import java.net.URI;
2324

25+
import org.asynchttpclient.AsyncHandler;
2426
import org.asynchttpclient.AsyncHttpClientConfig;
2527
import org.asynchttpclient.Cookie;
28+
import org.asynchttpclient.HttpResponseHeaders;
29+
import org.asynchttpclient.HttpResponseStatus;
2630
import org.asynchttpclient.MaxRedirectException;
2731
import org.asynchttpclient.Request;
2832
import org.asynchttpclient.RequestBuilder;
33+
import org.asynchttpclient.filter.FilterContext;
34+
import org.asynchttpclient.filter.FilterException;
35+
import org.asynchttpclient.filter.ResponseFilter;
2936
import org.asynchttpclient.org.jboss.netty.handler.codec.http.CookieDecoder;
3037
import org.asynchttpclient.providers.netty.Callback;
3138
import org.asynchttpclient.providers.netty.NettyAsyncHttpProviderConfig;
@@ -63,9 +70,12 @@ protected boolean redirect(Request request, NettyResponseFuture<?> future, HttpR
6370
io.netty.handler.codec.http.HttpResponseStatus status = response.getStatus();
6471
boolean redirectEnabled = request.isRedirectOverrideSet() ? request.isRedirectEnabled() : config.isRedirectEnabled();
6572
boolean isRedirectStatus = status.equals(MOVED_PERMANENTLY) || status.equals(FOUND) || status.equals(SEE_OTHER) || status.equals(TEMPORARY_REDIRECT);
73+
6674
if (redirectEnabled && isRedirectStatus) {
75+
if (future.incrementAndGetCurrentRedirectCount() >= config.getMaxRedirects()) {
76+
throw new MaxRedirectException("Maximum redirect reached: " + config.getMaxRedirects());
6777

68-
if (future.incrementAndGetCurrentRedirectCount() < config.getMaxRedirects()) {
78+
} else {
6979
// We must allow 401 handling again.
7080
future.getAndSetAuth(false);
7181

@@ -132,8 +142,38 @@ public void call() throws Exception {
132142
requestSender.sendNextRequest(target, future);
133143
return true;
134144
}
135-
} else {
136-
throw new MaxRedirectException("Maximum redirect reached: " + config.getMaxRedirects());
145+
}
146+
}
147+
return false;
148+
}
149+
150+
protected boolean applyResponseFiltersAndReplayRequest(ChannelHandlerContext ctx, NettyResponseFuture<?> future, HttpResponseStatus status, HttpResponseHeaders responseHeaders)
151+
throws IOException {
152+
153+
if (!config.getResponseFilters().isEmpty()) {
154+
AsyncHandler handler = future.getAsyncHandler();
155+
FilterContext fc = new FilterContext.FilterContextBuilder().asyncHandler(handler).request(future.getRequest()).responseStatus(status).responseHeaders(responseHeaders)
156+
.build();
157+
158+
for (ResponseFilter asyncFilter : config.getResponseFilters()) {
159+
try {
160+
fc = asyncFilter.filter(fc);
161+
// FIXME Is it worth protecting against this?
162+
if (fc == null) {
163+
throw new NullPointerException("FilterContext is null");
164+
}
165+
} catch (FilterException efe) {
166+
channels.abort(future, efe);
167+
}
168+
}
169+
170+
// The handler may have been wrapped.
171+
future.setAsyncHandler(fc.getAsyncHandler());
172+
173+
// The request has changed
174+
if (fc.replayRequest()) {
175+
requestSender.replayRequest(future, fc, ctx);
176+
return true;
137177
}
138178
}
139179
return false;

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

Lines changed: 9 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import io.netty.handler.codec.http.websocketx.WebSocketFrame;
2828

2929
import java.io.IOException;
30+
import java.util.Locale;
3031

3132
import org.asynchttpclient.AsyncHandler.STATE;
3233
import org.asynchttpclient.AsyncHttpClientConfig;
@@ -84,29 +85,10 @@ public void handle(ChannelHandlerContext ctx, NettyResponseFuture future, Object
8485

8586
if (e instanceof HttpResponse) {
8687
HttpResponse response = (HttpResponse) e;
87-
88-
HttpResponseStatus s = new ResponseStatus(future.getURI(), response, config);
88+
HttpResponseStatus status = new ResponseStatus(future.getURI(), response, config);
8989
HttpResponseHeaders responseHeaders = new ResponseHeaders(future.getURI(), response.headers());
9090

91-
// FIXME there's a method for that IIRC
92-
FilterContext<?> fc = new FilterContext.FilterContextBuilder().asyncHandler(h).request(request).responseStatus(s).responseHeaders(responseHeaders).build();
93-
for (ResponseFilter asyncFilter : config.getResponseFilters()) {
94-
try {
95-
fc = asyncFilter.filter(fc);
96-
if (fc == null) {
97-
throw new NullPointerException("FilterContext is null");
98-
}
99-
} catch (FilterException efe) {
100-
channels.abort(future, efe);
101-
}
102-
}
103-
104-
// The handler may have been wrapped.
105-
future.setAsyncHandler(fc.getAsyncHandler());
106-
107-
// The request has changed
108-
if (fc.replayRequest()) {
109-
requestSender.replayRequest(future, fc, ctx);
91+
if (applyResponseFiltersAndReplayRequest(ctx, future, status, responseHeaders)) {
11092
return;
11193
}
11294

@@ -118,13 +100,13 @@ public void handle(ChannelHandlerContext ctx, NettyResponseFuture future, Object
118100
boolean validUpgrade = response.headers().get(HttpHeaders.Names.UPGRADE) != null;
119101
String c = response.headers().get(HttpHeaders.Names.CONNECTION);
120102
if (c == null) {
121-
c = response.headers().get(HttpHeaders.Names.CONNECTION.toLowerCase());
103+
c = response.headers().get(HttpHeaders.Names.CONNECTION.toLowerCase(Locale.ENGLISH));
122104
}
123105

124-
boolean validConnection = c == null ? false : c.equalsIgnoreCase(HttpHeaders.Values.UPGRADE);
106+
boolean validConnection = c != null && c.equalsIgnoreCase(HttpHeaders.Values.UPGRADE);
125107

126-
s = new ResponseStatus(future.getURI(), response, config);
127-
final boolean statusReceived = h.onStatusReceived(s) == STATE.UPGRADE;
108+
status = new ResponseStatus(future.getURI(), response, config);
109+
final boolean statusReceived = h.onStatusReceived(status) == STATE.UPGRADE;
128110

129111
final boolean headerOK = h.onHeadersReceived(responseHeaders) == STATE.CONTINUE;
130112
if (!headerOK || !validStatus || !validUpgrade || !validConnection || !statusReceived) {
@@ -222,12 +204,11 @@ public void onClose(ChannelHandlerContext ctx) {
222204
WebSocketUpgradeHandler h = WebSocketUpgradeHandler.class.cast(nettyResponse.getAsyncHandler());
223205
NettyWebSocket webSocket = NettyWebSocket.class.cast(h.onCompleted());
224206

225-
// FIXME How could this test not succeed, attachment is a
226-
// NettyResponseFuture????
207+
// FIXME How could this test not succeed, we just checked above that attribute is a NettyResponseFuture????
227208
if (attribute != DiscardEvent.INSTANCE)
228209
webSocket.close(1006, "Connection was closed abnormally (that is, with no close frame being sent).");
229210
} catch (Throwable t) {
230211
LOGGER.error("onError", t);
231212
}
232213
}
233-
}
214+
}

0 commit comments

Comments
 (0)