Skip to content

Commit a2ba430

Browse files
committed
+ Update TransportCustomizer to accept a FilterChainBuilder instance
to allow futher customization (i.e., custom feature filters).. + Allow for request timeout disabling.
1 parent b8ce465 commit a2ba430

File tree

4 files changed

+72
-50
lines changed

4 files changed

+72
-50
lines changed

src/main/java/com/ning/http/client/providers/grizzly/GrizzlyAsyncHttpProvider.java

Lines changed: 58 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -278,57 +278,47 @@ protected <T> ListenableFuture<T> execute(final Connection c,
278278

279279
protected void initializeTransport(AsyncHttpClientConfig clientConfig) {
280280

281-
GrizzlyAsyncHttpProviderConfig providerConfig =
282-
(GrizzlyAsyncHttpProviderConfig) clientConfig.getAsyncHttpProviderConfig();
283-
if (providerConfig != null) {
284-
final TransportCustomizer customizer = (TransportCustomizer)
285-
providerConfig.getProperty(TRANSPORT_CUSTOMIZER);
286-
if (customizer != null) {
287-
customizer.customize(clientTransport);
288-
} else {
289-
clientTransport.setIOStrategy(SameThreadIOStrategy.getInstance());
290-
}
291-
} else {
292-
clientTransport.setIOStrategy(SameThreadIOStrategy.getInstance());
293-
}
281+
294282

295283
final FilterChainBuilder fcb = FilterChainBuilder.stateless();
296284
fcb.add(new AsyncHttpClientTransportFilter());
297285

298286
final int timeout = clientConfig.getRequestTimeoutInMs();
299-
int delay = 500;
300-
if (timeout < delay) {
301-
delay = timeout - 10;
302-
}
303-
timeoutExecutor = IdleTimeoutFilter.createDefaultIdleDelayedExecutor(delay, TimeUnit.MILLISECONDS);
304-
timeoutExecutor.start();
305-
final IdleTimeoutFilter.TimeoutResolver timeoutResolver =
306-
new IdleTimeoutFilter.TimeoutResolver() {
307-
@Override
308-
public long getTimeout(FilterChainContext ctx) {
309-
final HttpTransactionContext context =
310-
GrizzlyAsyncHttpProvider.this.getHttpTransactionContext(ctx.getConnection());
311-
if (context != null) {
312-
final PerRequestConfig config = context.request.getPerRequestConfig();
313-
if (config != null) {
314-
final long timeout = config.getRequestTimeoutInMs();
315-
if (timeout > 0) {
316-
return timeout;
287+
if (timeout > 0) {
288+
int delay = 500;
289+
if (timeout < delay) {
290+
delay = timeout - 10;
291+
}
292+
timeoutExecutor = IdleTimeoutFilter.createDefaultIdleDelayedExecutor(delay, TimeUnit.MILLISECONDS);
293+
timeoutExecutor.start();
294+
final IdleTimeoutFilter.TimeoutResolver timeoutResolver =
295+
new IdleTimeoutFilter.TimeoutResolver() {
296+
@Override
297+
public long getTimeout(FilterChainContext ctx) {
298+
final HttpTransactionContext context =
299+
GrizzlyAsyncHttpProvider.this.getHttpTransactionContext(ctx.getConnection());
300+
if (context != null) {
301+
final PerRequestConfig config = context.request.getPerRequestConfig();
302+
if (config != null) {
303+
final long timeout = config.getRequestTimeoutInMs();
304+
if (timeout > 0) {
305+
return timeout;
306+
}
317307
}
318308
}
309+
return timeout;
319310
}
320-
return timeout;
321-
}
322-
};
323-
final IdleTimeoutFilter timeoutFilter = new IdleTimeoutFilter(timeoutExecutor,
324-
timeoutResolver,
325-
new IdleTimeoutFilter.TimeoutHandler() {
326-
public void onTimeout(Connection connection) {
327-
timeout(connection);
328-
}
329-
});
330-
fcb.add(timeoutFilter);
331-
resolver = timeoutFilter.getResolver();
311+
};
312+
final IdleTimeoutFilter timeoutFilter = new IdleTimeoutFilter(timeoutExecutor,
313+
timeoutResolver,
314+
new IdleTimeoutFilter.TimeoutHandler() {
315+
public void onTimeout(Connection connection) {
316+
timeout(connection);
317+
}
318+
});
319+
fcb.add(timeoutFilter);
320+
resolver = timeoutFilter.getResolver();
321+
}
332322

333323
SSLContext context = clientConfig.getSSLContext();
334324
boolean defaultSecState = (context != null);
@@ -364,6 +354,21 @@ public void onTimeout(Connection connection) {
364354
}
365355
fcb.add(eventFilter);
366356
fcb.add(clientFilter);
357+
358+
GrizzlyAsyncHttpProviderConfig providerConfig =
359+
(GrizzlyAsyncHttpProviderConfig) clientConfig.getAsyncHttpProviderConfig();
360+
if (providerConfig != null) {
361+
final TransportCustomizer customizer = (TransportCustomizer)
362+
providerConfig.getProperty(TRANSPORT_CUSTOMIZER);
363+
if (customizer != null) {
364+
customizer.customize(clientTransport, fcb);
365+
} else {
366+
clientTransport.setIOStrategy(SameThreadIOStrategy.getInstance());
367+
}
368+
} else {
369+
clientTransport.setIOStrategy(SameThreadIOStrategy.getInstance());
370+
}
371+
367372
clientTransport.setProcessor(fcb.build());
368373

369374
}
@@ -379,12 +384,16 @@ void touchConnection(final Connection c, final Request request) {
379384
final long timeout = config.getRequestTimeoutInMs();
380385
if (timeout > 0) {
381386
final long newTimeout = System.currentTimeMillis() + timeout;
382-
resolver.setTimeoutMillis(c, newTimeout);
387+
if (resolver != null) {
388+
resolver.setTimeoutMillis(c, newTimeout);
389+
}
383390
}
384391
} else {
385392
final long timeout = clientConfig.getRequestTimeoutInMs();
386393
if (timeout > 0) {
387-
resolver.setTimeoutMillis(c, System.currentTimeMillis() + timeout);
394+
if (resolver != null) {
395+
resolver.setTimeoutMillis(c, System.currentTimeMillis() + timeout);
396+
}
388397
}
389398
}
390399

@@ -1061,6 +1070,7 @@ protected void onInitialLineParsed(HttpHeader httpHeader,
10611070
protected void onHttpError(final HttpHeader httpHeader,
10621071
final FilterChainContext ctx,
10631072
final Throwable t) throws IOException {
1073+
t.printStackTrace();
10641074
httpHeader.setSkipRemainder(true);
10651075
final HttpTransactionContext context =
10661076
provider.getHttpTransactionContext(ctx.getConnection());
@@ -2119,7 +2129,9 @@ boolean returnConnection(final String url, final Connection c) {
21192129
final boolean result = (DO_NOT_CACHE.get(c) == null
21202130
&& pool.offer(AsyncHttpProviderUtils.getBaseUrl(url), c));
21212131
if (result) {
2122-
provider.resolver.setTimeoutMillis(c, IdleTimeoutFilter.FOREVER);
2132+
if (provider.resolver != null) {
2133+
provider.resolver.setTimeoutMillis(c, IdleTimeoutFilter.FOREVER);
2134+
}
21232135
}
21242136
return result;
21252137

src/main/java/com/ning/http/client/providers/grizzly/TransportCustomizer.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
package com.ning.http.client.providers.grizzly;
1515

16+
import org.glassfish.grizzly.filterchain.FilterChainBuilder;
1617
import org.glassfish.grizzly.nio.transport.TCPNIOTransport;
1718

1819
/**
@@ -27,10 +28,17 @@ public interface TransportCustomizer {
2728

2829
/**
2930
* Customizes the configuration of the provided {@link TCPNIOTransport}
30-
* instance.
31+
* and {@link FilterChainBuilder} instances.
3132
*
3233
* @param transport the {@link TCPNIOTransport} instance for this client.
34+
* @param filterChainBuilder the {@link FilterChainBuilder} that will
35+
* produce the {@link org.glassfish.grizzly.filterchain.FilterChain} that
36+
* will be used to send/receive data. The FilterChain will be populated
37+
* with the Filters typically used for processing HTTP client requests.
38+
* These filters should generally be left alone. But this does allow
39+
* adding additional filters to the chain to add additional features.
3340
*/
34-
void customize(final TCPNIOTransport transport);
41+
void customize(final TCPNIOTransport transport,
42+
final FilterChainBuilder filterChainBuilder);
3543

3644
}

src/test/java/com/ning/http/client/async/grizzly/GrizzlyAsyncProviderBasicTest.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import com.ning.http.client.providers.grizzly.GrizzlyAsyncHttpProvider;
2121
import com.ning.http.client.providers.grizzly.GrizzlyAsyncHttpProviderConfig;
2222
import com.ning.http.client.providers.grizzly.TransportCustomizer;
23+
import org.glassfish.grizzly.filterchain.FilterChainBuilder;
2324
import org.glassfish.grizzly.nio.transport.TCPNIOTransport;
2425
import org.glassfish.grizzly.strategies.SameThreadIOStrategy;
2526

@@ -41,7 +42,7 @@ protected AsyncHttpProviderConfig getProviderConfig() {
4142
final GrizzlyAsyncHttpProviderConfig config = new GrizzlyAsyncHttpProviderConfig();
4243
config.addProperty(TRANSPORT_CUSTOMIZER, new TransportCustomizer() {
4344
@Override
44-
public void customize(TCPNIOTransport transport) {
45+
public void customize(TCPNIOTransport transport, FilterChainBuilder builder) {
4546
transport.setTcpNoDelay(true);
4647
transport.setIOStrategy(SameThreadIOStrategy.getInstance());
4748
}

src/test/java/com/ning/http/client/async/grizzly/GrizzlyRedirectConnectionUsageTest.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import com.ning.http.client.providers.grizzly.GrizzlyAsyncHttpProvider;
2121
import com.ning.http.client.providers.grizzly.GrizzlyAsyncHttpProviderConfig;
2222
import com.ning.http.client.providers.grizzly.TransportCustomizer;
23+
import org.glassfish.grizzly.filterchain.FilterChainBuilder;
2324
import org.glassfish.grizzly.nio.transport.TCPNIOTransport;
2425
import org.glassfish.grizzly.strategies.SameThreadIOStrategy;
2526

@@ -40,7 +41,7 @@ protected AsyncHttpProviderConfig getProviderConfig() {
4041
final GrizzlyAsyncHttpProviderConfig config = new GrizzlyAsyncHttpProviderConfig();
4142
config.addProperty(TRANSPORT_CUSTOMIZER, new TransportCustomizer() {
4243
@Override
43-
public void customize(TCPNIOTransport transport) {
44+
public void customize(TCPNIOTransport transport, FilterChainBuilder builder) {
4445
if (System.getProperty("blockingio") != null) {
4546
transport.configureBlocking(true);
4647
}

0 commit comments

Comments
 (0)