package org.infinispan.server.core.transport; import org.infinispan.server.core.ProtocolServer; import org.infinispan.server.core.configuration.ProtocolServerConfiguration; import org.infinispan.server.core.configuration.SslConfiguration; import org.infinispan.server.core.utils.SslUtils; import io.netty.channel.Channel; import io.netty.channel.ChannelOutboundHandler; import io.netty.channel.ChannelPipeline; import io.netty.handler.ssl.JdkSslContext; import io.netty.handler.ssl.SniHandler; import io.netty.util.DomainNameMappingBuilder; /** * Pipeline factory for Netty based channels. For each pipeline created, a new decoder is created which means that * each incoming connection deals with a unique decoder instance. Since the encoder does not maintain any state, * a single encoder instance is shared by all incoming connections, if and only if, the protocol mandates an encoder. * * @author Galder Zamarreño * @author Sebastian Łaskawiec * @since 4.1 */ public class NettyChannelInitializer<A extends ProtocolServerConfiguration> implements NettyInitializer { protected final ProtocolServer<A> server; protected final NettyTransport transport; protected final ChannelOutboundHandler encoder; public NettyChannelInitializer(ProtocolServer<A> server, NettyTransport transport, ChannelOutboundHandler encoder) { this.server = server; this.transport = transport; this.encoder = encoder; } @Override public void initializeChannel(Channel ch) throws Exception { ChannelPipeline pipeline = ch.pipeline(); if(transport != null) { pipeline.addLast("stats", new StatsChannelHandler(transport)); } SslConfiguration ssl = server.getConfiguration().ssl(); if (ssl.enabled()) { //add default domain mapping JdkSslContext defaultNettySslContext = SslUtils.createNettySslContext(ssl, ssl.sniDomainsConfiguration().get(SslConfiguration.DEFAULT_SNI_DOMAIN)); DomainNameMappingBuilder<JdkSslContext> domainMappingBuilder = new DomainNameMappingBuilder<>(defaultNettySslContext); //and the rest ssl.sniDomainsConfiguration().forEach((k, v) -> { if (!SslConfiguration.DEFAULT_SNI_DOMAIN.equals(k)) { domainMappingBuilder.add(k, SslUtils.createNettySslContext(ssl, v)); } }); pipeline.addLast("sni", new SniHandler(domainMappingBuilder.build())); } pipeline.addLast("decoder", server.getDecoder()); if (encoder != null) pipeline.addLast("encoder", encoder); } }