56
56
import software .amazon .awssdk .http .nio .netty .internal .RequestAdapter ;
57
57
import software .amazon .awssdk .http .nio .netty .internal .RequestContext ;
58
58
import software .amazon .awssdk .http .nio .netty .internal .RunnableRequest ;
59
+ import software .amazon .awssdk .http .nio .netty .internal .SdkChannelOptions ;
59
60
import software .amazon .awssdk .http .nio .netty .internal .SdkChannelPoolMap ;
60
61
import software .amazon .awssdk .http .nio .netty .internal .SharedSdkEventLoopGroup ;
61
62
import software .amazon .awssdk .http .nio .netty .internal .http2 .HttpOrHttp2ChannelPool ;
@@ -73,6 +74,7 @@ public final class NettyNioAsyncHttpClient implements SdkAsyncHttpClient {
73
74
private final RequestAdapter requestAdapter = new RequestAdapter ();
74
75
private final SdkEventLoopGroup sdkEventLoopGroup ;
75
76
private final ChannelPoolMap <URI , ChannelPool > pools ;
77
+ private final SdkChannelOptions sdkChannelOptions ;
76
78
private final NettyConfiguration configuration ;
77
79
private final long maxStreams ;
78
80
private Protocol protocol ;
@@ -83,6 +85,11 @@ public final class NettyNioAsyncHttpClient implements SdkAsyncHttpClient {
83
85
this .maxStreams = 200 ;
84
86
this .sdkEventLoopGroup = eventLoopGroup (builder );
85
87
this .pools = createChannelPoolMap ();
88
+ this .sdkChannelOptions = channelOptions (builder );
89
+ }
90
+
91
+ private SdkChannelOptions channelOptions (DefaultBuilder builder ) {
92
+ return builder .sdkChannelOptions ;
86
93
}
87
94
88
95
private SdkEventLoopGroup eventLoopGroup (DefaultBuilder builder ) {
@@ -144,8 +151,8 @@ protected ChannelPool newPool(URI key) {
144
151
.channelFactory (sdkEventLoopGroup .channelFactory ())
145
152
.option (ChannelOption .CONNECT_TIMEOUT_MILLIS , configuration .connectTimeoutMillis ())
146
153
// TODO run some performance tests with and without this.
147
- .option (ChannelOption .TCP_NODELAY , true )
148
154
.remoteAddress (key .getHost (), key .getPort ());
155
+ sdkChannelOptions .channelOptions ().forEach (bootstrap ::option );
149
156
AtomicReference <ChannelPool > channelPoolRef = new AtomicReference <>();
150
157
ChannelPipelineInitializer handler =
151
158
new ChannelPipelineInitializer (protocol , sslContext , maxStreams , channelPoolRef );
@@ -279,6 +286,16 @@ public interface Builder extends SdkAsyncHttpClient.Builder<NettyNioAsyncHttpCli
279
286
* @return This builder for method chaining.
280
287
*/
281
288
Builder protocol (Protocol protocol );
289
+
290
+ /**
291
+ * Add new socket channel option which will be used to create Netty Http client. This allows custom configuration
292
+ * for Netty.
293
+ * @param channelOption {@link ChannelOption} to set
294
+ * @param value See {@link ChannelOption} to find the type of value for each option
295
+ * @return This builder for method chaining.
296
+ * @see SdkEventLoopGroup.Builder
297
+ */
298
+ Builder putChannelOption (ChannelOption channelOption , Object value );
282
299
}
283
300
284
301
/**
@@ -288,6 +305,9 @@ public interface Builder extends SdkAsyncHttpClient.Builder<NettyNioAsyncHttpCli
288
305
private static final class DefaultBuilder implements Builder {
289
306
290
307
private final AttributeMap .Builder standardOptions = AttributeMap .builder ();
308
+
309
+ private SdkChannelOptions sdkChannelOptions = new SdkChannelOptions ();
310
+
291
311
private SdkEventLoopGroup eventLoopGroup ;
292
312
private SdkEventLoopGroup .Builder eventLoopGroupBuilder ;
293
313
@@ -423,11 +443,18 @@ public void setProtocol(Protocol protocol) {
423
443
protocol (protocol );
424
444
}
425
445
446
+ @ Override
447
+ public Builder putChannelOption (ChannelOption channelOption , Object value ) {
448
+ this .sdkChannelOptions .putOption (channelOption , value );
449
+ return this ;
450
+ }
451
+
426
452
@ Override
427
453
public SdkAsyncHttpClient buildWithDefaults (AttributeMap serviceDefaults ) {
428
454
return new NettyNioAsyncHttpClient (this , standardOptions .build ()
429
455
.merge (serviceDefaults )
430
456
.merge (SdkHttpConfigurationOption .GLOBAL_HTTP_DEFAULTS ));
457
+
431
458
}
432
459
}
433
460
}
0 commit comments