Skip to content

Commit d490a84

Browse files
committed
Introduce Interceptors
1 parent 3656c92 commit d490a84

File tree

10 files changed

+140
-96
lines changed

10 files changed

+140
-96
lines changed

client/src/main/java/org/asynchttpclient/netty/handler/AsyncHttpClientHandler.java

Lines changed: 3 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -13,17 +13,13 @@
1313
*/
1414
package org.asynchttpclient.netty.handler;
1515

16-
import static org.asynchttpclient.util.HttpConstants.ResponseStatusCodes.*;
1716
import static org.asynchttpclient.util.MiscUtils.getCause;
1817
import io.netty.buffer.ByteBuf;
1918
import io.netty.channel.Channel;
2019
import io.netty.channel.ChannelHandlerContext;
2120
import io.netty.channel.ChannelInboundHandlerAdapter;
2221
import io.netty.handler.codec.PrematureChannelClosureException;
2322
import io.netty.handler.codec.http.HttpContent;
24-
import io.netty.handler.codec.http.HttpMethod;
25-
import io.netty.handler.codec.http.HttpRequest;
26-
import io.netty.handler.codec.http.HttpResponse;
2723
import io.netty.handler.codec.http.LastHttpContent;
2824
import io.netty.util.ReferenceCountUtil;
2925

@@ -32,17 +28,15 @@
3228

3329
import org.asynchttpclient.AsyncHttpClientConfig;
3430
import org.asynchttpclient.HttpResponseBodyPart;
35-
import org.asynchttpclient.Realm;
36-
import org.asynchttpclient.Request;
3731
import org.asynchttpclient.exception.ChannelClosedException;
3832
import org.asynchttpclient.netty.Callback;
3933
import org.asynchttpclient.netty.DiscardEvent;
4034
import org.asynchttpclient.netty.NettyResponseFuture;
4135
import org.asynchttpclient.netty.channel.ChannelManager;
4236
import org.asynchttpclient.netty.channel.Channels;
4337
import org.asynchttpclient.netty.future.StackTraceInspector;
38+
import org.asynchttpclient.netty.handler.intercept.Interceptors;
4439
import org.asynchttpclient.netty.request.NettyRequestSender;
45-
import org.asynchttpclient.proxy.ProxyServer;
4640
import org.slf4j.Logger;
4741
import org.slf4j.LoggerFactory;
4842

@@ -53,12 +47,7 @@ public abstract class AsyncHttpClientHandler extends ChannelInboundHandlerAdapte
5347
protected final AsyncHttpClientConfig config;
5448
protected final ChannelManager channelManager;
5549
protected final NettyRequestSender requestSender;
56-
private final Unauthorized401Handler unauthorized401Handler;
57-
private final ProxyUnauthorized407Handler proxyUnauthorized407Handler;
58-
private final Continue100Handler continue100Handler;
59-
private final Redirect30xHandler redirect30xHandler;
60-
private final ConnectSuccessHandler connectSuccessHandler;
61-
protected final ResponseFiltersHandler responseFiltersHandler;
50+
protected final Interceptors interceptors;
6251
protected final boolean hasIOExceptionFilters;
6352

6453
public AsyncHttpClientHandler(AsyncHttpClientConfig config,//
@@ -67,12 +56,7 @@ public AsyncHttpClientHandler(AsyncHttpClientConfig config,//
6756
this.config = config;
6857
this.channelManager = channelManager;
6958
this.requestSender = requestSender;
70-
unauthorized401Handler = new Unauthorized401Handler(channelManager, requestSender);
71-
proxyUnauthorized407Handler = new ProxyUnauthorized407Handler(channelManager, requestSender);
72-
continue100Handler = new Continue100Handler(requestSender);
73-
redirect30xHandler = new Redirect30xHandler(channelManager, config, requestSender);
74-
connectSuccessHandler = new ConnectSuccessHandler(channelManager, requestSender);
75-
responseFiltersHandler = new ResponseFiltersHandler(config, requestSender);
59+
interceptors = new Interceptors(config, channelManager, requestSender);
7660
hasIOExceptionFilters = !config.getIoExceptionFilters().isEmpty();
7761
}
7862

@@ -258,31 +242,4 @@ private boolean isHandledByReactiveStreams(ChannelHandlerContext ctx) {
258242
public abstract void handleException(NettyResponseFuture<?> future, Throwable error);
259243

260244
public abstract void handleChannelInactive(NettyResponseFuture<?> future);
261-
262-
protected boolean exitAfterSpecialCases(final HttpResponse response, final Channel channel, final NettyResponseFuture<?> future) throws Exception {
263-
264-
HttpRequest httpRequest = future.getNettyRequest().getHttpRequest();
265-
ProxyServer proxyServer = future.getProxyServer();
266-
int statusCode = response.getStatus().code();
267-
Request request = future.getCurrentRequest();
268-
Realm realm = request.getRealm() != null ? request.getRealm() : config.getRealm();
269-
270-
if (statusCode == UNAUTHORIZED_401) {
271-
return unauthorized401Handler.exitAfterHandling401(channel, future, response, request, statusCode, realm, proxyServer, httpRequest);
272-
273-
} else if (statusCode == PROXY_AUTHENTICATION_REQUIRED_407) {
274-
return proxyUnauthorized407Handler.exitAfterHandling407(channel, future, response, request, statusCode, proxyServer, httpRequest);
275-
276-
} else if (statusCode == CONTINUE_100) {
277-
return continue100Handler.exitAfterHandling100(channel, future, statusCode);
278-
279-
} else if (Redirect30xHandler.REDIRECT_STATUSES.contains(statusCode)) {
280-
return redirect30xHandler.exitAfterHandlingRedirect(channel, future, response, request, statusCode, realm);
281-
282-
} else if (httpRequest.getMethod() == HttpMethod.CONNECT && statusCode == OK_200) {
283-
return connectSuccessHandler.exitAfterHandlingConnect(channel, future, request, proxyServer, statusCode, httpRequest);
284-
285-
}
286-
return false;
287-
}
288245
}

client/src/main/java/org/asynchttpclient/netty/handler/HttpHandler.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -128,9 +128,8 @@ private boolean handleHttpResponse(final HttpResponse response, final Channel ch
128128
NettyResponseStatus status = new NettyResponseStatus(future.getUri(), config, response, channel);
129129
HttpResponseHeaders responseHeaders = new HttpResponseHeaders(response.headers());
130130

131-
return responseFiltersHandler.exitAfterProcessingFilters(channel, future, handler, status, responseHeaders) || //
132-
exitAfterSpecialCases(response, channel, future) || //
133-
exitAfterHandler(channel, future, response, handler, status, httpRequest, responseHeaders);
131+
return interceptors.intercept(channel, future, handler, response, status, responseHeaders)
132+
|| exitAfterHandler(channel, future, response, handler, status, httpRequest, responseHeaders);
134133
}
135134

136135
private void handleChunk(HttpContent chunk,//

client/src/main/java/org/asynchttpclient/netty/handler/WebSocketHandler.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -140,8 +140,7 @@ public void handleRead(Channel channel, NettyResponseFuture<?> future, Object e)
140140
HttpResponseStatus status = new NettyResponseStatus(future.getUri(), config, response, channel);
141141
HttpResponseHeaders responseHeaders = new HttpResponseHeaders(response.headers());
142142

143-
if (responseFiltersHandler.exitAfterProcessingFilters(channel, future, handler, status, responseHeaders) || //
144-
exitAfterSpecialCases(response, channel, future)) {
143+
if (interceptors.intercept(channel, future, handler, response, status, responseHeaders)) {
145144
return;
146145
}
147146

client/src/main/java/org/asynchttpclient/netty/handler/ConnectSuccessHandler.java renamed to client/src/main/java/org/asynchttpclient/netty/handler/intercept/ConnectSuccessInterceptor.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1212
* See the Apache License Version 2.0 for the specific language governing permissions and limitations there under.
1313
*/
14-
package org.asynchttpclient.netty.handler;
14+
package org.asynchttpclient.netty.handler.intercept;
1515

1616
import io.netty.channel.Channel;
1717
import io.netty.handler.codec.http.HttpRequest;
@@ -28,14 +28,14 @@
2828
import org.slf4j.Logger;
2929
import org.slf4j.LoggerFactory;
3030

31-
public class ConnectSuccessHandler {
31+
public class ConnectSuccessInterceptor {
3232

33-
private static final Logger LOGGER = LoggerFactory.getLogger(ConnectSuccessHandler.class);
33+
private static final Logger LOGGER = LoggerFactory.getLogger(ConnectSuccessInterceptor.class);
3434

3535
private final ChannelManager channelManager;
3636
private final NettyRequestSender requestSender;
3737

38-
public ConnectSuccessHandler(ChannelManager channelManager, NettyRequestSender requestSender) {
38+
public ConnectSuccessInterceptor(ChannelManager channelManager, NettyRequestSender requestSender) {
3939
this.channelManager = channelManager;
4040
this.requestSender = requestSender;
4141
}

client/src/main/java/org/asynchttpclient/netty/handler/Continue100Handler.java renamed to client/src/main/java/org/asynchttpclient/netty/handler/intercept/Continue100Interceptor.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1212
* See the Apache License Version 2.0 for the specific language governing permissions and limitations there under.
1313
*/
14-
package org.asynchttpclient.netty.handler;
14+
package org.asynchttpclient.netty.handler.intercept;
1515

1616
import io.netty.channel.Channel;
1717

@@ -22,11 +22,11 @@
2222
import org.asynchttpclient.netty.channel.Channels;
2323
import org.asynchttpclient.netty.request.NettyRequestSender;
2424

25-
public class Continue100Handler {
25+
public class Continue100Interceptor {
2626

2727
private final NettyRequestSender requestSender;
2828

29-
public Continue100Handler(NettyRequestSender requestSender) {
29+
public Continue100Interceptor(NettyRequestSender requestSender) {
3030
this.requestSender = requestSender;
3131
}
3232

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
/*
2+
* Copyright (c) 2015 AsyncHttpClient Project. All rights reserved.
3+
*
4+
* This program is licensed to you under the Apache License Version 2.0,
5+
* and you may not use this file except in compliance with the Apache License Version 2.0.
6+
* You may obtain a copy of the Apache License Version 2.0 at
7+
* http://www.apache.org/licenses/LICENSE-2.0.
8+
*
9+
* Unless required by applicable law or agreed to in writing,
10+
* software distributed under the Apache License Version 2.0 is distributed on an
11+
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
* See the Apache License Version 2.0 for the specific language governing permissions and limitations there under.
13+
*/
14+
package org.asynchttpclient.netty.handler.intercept;
15+
16+
import static org.asynchttpclient.util.HttpConstants.ResponseStatusCodes.*;
17+
import io.netty.channel.Channel;
18+
import io.netty.handler.codec.http.HttpMethod;
19+
import io.netty.handler.codec.http.HttpRequest;
20+
import io.netty.handler.codec.http.HttpResponse;
21+
22+
import org.asynchttpclient.AsyncHandler;
23+
import org.asynchttpclient.AsyncHttpClientConfig;
24+
import org.asynchttpclient.HttpResponseHeaders;
25+
import org.asynchttpclient.HttpResponseStatus;
26+
import org.asynchttpclient.Realm;
27+
import org.asynchttpclient.Request;
28+
import org.asynchttpclient.netty.NettyResponseFuture;
29+
import org.asynchttpclient.netty.channel.ChannelManager;
30+
import org.asynchttpclient.netty.request.NettyRequestSender;
31+
import org.asynchttpclient.proxy.ProxyServer;
32+
33+
public class Interceptors {
34+
35+
private final AsyncHttpClientConfig config;
36+
private final Unauthorized401Interceptor unauthorized401Interceptor;
37+
private final ProxyUnauthorized407Interceptor proxyUnauthorized407Interceptor;
38+
private final Continue100Interceptor continue100Interceptor;
39+
private final Redirect30xInterceptor redirect30xInterceptor;
40+
private final ConnectSuccessInterceptor connectSuccessInterceptor;
41+
private final ResponseFiltersInterceptor responseFiltersInterceptor;
42+
private final boolean hasResponseFilters;
43+
44+
public Interceptors(//
45+
AsyncHttpClientConfig config,//
46+
ChannelManager channelManager,//
47+
NettyRequestSender requestSender) {
48+
this.config = config;
49+
unauthorized401Interceptor = new Unauthorized401Interceptor(channelManager, requestSender);
50+
proxyUnauthorized407Interceptor = new ProxyUnauthorized407Interceptor(channelManager, requestSender);
51+
continue100Interceptor = new Continue100Interceptor(requestSender);
52+
redirect30xInterceptor = new Redirect30xInterceptor(channelManager, config, requestSender);
53+
connectSuccessInterceptor = new ConnectSuccessInterceptor(channelManager, requestSender);
54+
responseFiltersInterceptor = new ResponseFiltersInterceptor(config, requestSender);
55+
hasResponseFilters = !config.getResponseFilters().isEmpty();
56+
}
57+
58+
public boolean intercept(//
59+
Channel channel,//
60+
NettyResponseFuture<?> future,//
61+
AsyncHandler<?> handler,//
62+
HttpResponse response,//
63+
HttpResponseStatus status,//
64+
HttpResponseHeaders responseHeaders) throws Exception {
65+
66+
HttpRequest httpRequest = future.getNettyRequest().getHttpRequest();
67+
ProxyServer proxyServer = future.getProxyServer();
68+
int statusCode = response.getStatus().code();
69+
Request request = future.getCurrentRequest();
70+
Realm realm = request.getRealm() != null ? request.getRealm() : config.getRealm();
71+
72+
if (hasResponseFilters && responseFiltersInterceptor.exitAfterProcessingFilters(channel, future, handler, status, responseHeaders)) {
73+
return true;
74+
}
75+
76+
if (statusCode == UNAUTHORIZED_401) {
77+
return unauthorized401Interceptor.exitAfterHandling401(channel, future, response, request, statusCode, realm, proxyServer, httpRequest);
78+
79+
} else if (statusCode == PROXY_AUTHENTICATION_REQUIRED_407) {
80+
return proxyUnauthorized407Interceptor.exitAfterHandling407(channel, future, response, request, statusCode, proxyServer, httpRequest);
81+
82+
} else if (statusCode == CONTINUE_100) {
83+
return continue100Interceptor.exitAfterHandling100(channel, future, statusCode);
84+
85+
} else if (Redirect30xInterceptor.REDIRECT_STATUSES.contains(statusCode)) {
86+
return redirect30xInterceptor.exitAfterHandlingRedirect(channel, future, response, request, statusCode, realm);
87+
88+
} else if (httpRequest.getMethod() == HttpMethod.CONNECT && statusCode == OK_200) {
89+
return connectSuccessInterceptor.exitAfterHandlingConnect(channel, future, request, proxyServer, statusCode, httpRequest);
90+
91+
}
92+
return false;
93+
}
94+
}

client/src/main/java/org/asynchttpclient/netty/handler/ProxyUnauthorized407Handler.java renamed to client/src/main/java/org/asynchttpclient/netty/handler/intercept/ProxyUnauthorized407Interceptor.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1212
* See the Apache License Version 2.0 for the specific language governing permissions and limitations there under.
1313
*/
14-
package org.asynchttpclient.netty.handler;
14+
package org.asynchttpclient.netty.handler.intercept;
1515

1616
import static org.asynchttpclient.Dsl.realm;
1717
import static org.asynchttpclient.util.AuthenticatorUtils.getHeaderWithPrefix;
@@ -39,14 +39,14 @@
3939
import org.slf4j.Logger;
4040
import org.slf4j.LoggerFactory;
4141

42-
public class ProxyUnauthorized407Handler {
42+
public class ProxyUnauthorized407Interceptor {
4343

44-
private static final Logger LOGGER = LoggerFactory.getLogger(ProxyUnauthorized407Handler.class);
44+
private static final Logger LOGGER = LoggerFactory.getLogger(ProxyUnauthorized407Interceptor.class);
4545

4646
private final ChannelManager channelManager;
4747
private final NettyRequestSender requestSender;
4848

49-
public ProxyUnauthorized407Handler(ChannelManager channelManager, NettyRequestSender requestSender) {
49+
public ProxyUnauthorized407Interceptor(ChannelManager channelManager, NettyRequestSender requestSender) {
5050
this.channelManager = channelManager;
5151
this.requestSender = requestSender;
5252
}

client/src/main/java/org/asynchttpclient/netty/handler/Redirect30xHandler.java renamed to client/src/main/java/org/asynchttpclient/netty/handler/intercept/Redirect30xInterceptor.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1212
* See the Apache License Version 2.0 for the specific language governing permissions and limitations there under.
1313
*/
14-
package org.asynchttpclient.netty.handler;
14+
package org.asynchttpclient.netty.handler.intercept;
1515

1616
import static io.netty.handler.codec.http.HttpHeaders.Names.*;
1717
import static org.asynchttpclient.util.HttpConstants.Methods.GET;
@@ -41,7 +41,7 @@
4141
import org.slf4j.Logger;
4242
import org.slf4j.LoggerFactory;
4343

44-
public class Redirect30xHandler {
44+
public class Redirect30xInterceptor {
4545

4646
public static final Set<Integer> REDIRECT_STATUSES = new HashSet<>();
4747
static {
@@ -51,21 +51,21 @@ public class Redirect30xHandler {
5151
REDIRECT_STATUSES.add(TEMPORARY_REDIRECT_307);
5252
}
5353

54-
private static final Logger LOGGER = LoggerFactory.getLogger(Redirect30xHandler.class);
54+
private static final Logger LOGGER = LoggerFactory.getLogger(Redirect30xInterceptor.class);
5555

5656
private final ChannelManager channelManager;
5757
private final AsyncHttpClientConfig config;
5858
private final NettyRequestSender requestSender;
5959
private final MaxRedirectException maxRedirectException;
6060

61-
public Redirect30xHandler(ChannelManager channelManager, AsyncHttpClientConfig config, NettyRequestSender requestSender) {
61+
public Redirect30xInterceptor(ChannelManager channelManager, AsyncHttpClientConfig config, NettyRequestSender requestSender) {
6262
this.channelManager = channelManager;
6363
this.config = config;
6464
this.requestSender = requestSender;
6565
maxRedirectException = new MaxRedirectException("Maximum redirect reached: " + config.getMaxRedirects());
6666
}
6767

68-
protected boolean exitAfterHandlingRedirect(//
68+
public boolean exitAfterHandlingRedirect(//
6969
Channel channel,//
7070
NettyResponseFuture<?> future,//
7171
HttpResponse response,//

0 commit comments

Comments
 (0)