in broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagement.java [540:673]
private ServerConnector createConnector(final HttpPort<?> port, final Server server)
{
port.setPortManager(this);
if (port.getState() != State.ACTIVE)
{
// TODO - RG - probably does nothing
port.startAsync();
}
final HttpConnectionFactory httpConnectionFactory = new HttpConnectionFactory();
httpConnectionFactory.getHttpConfiguration().setSendServerVersion(false);
httpConnectionFactory.getHttpConfiguration().setSendXPoweredBy(false);
HttpConfiguration.Customizer requestAttributeCustomizer = (connector, httpConfiguration, request) ->
HttpManagementUtil.getPortAttributeAction(port).performAction(request);
httpConnectionFactory.getHttpConfiguration().addCustomizer(requestAttributeCustomizer);
httpConnectionFactory.getHttpConfiguration().addCustomizer(new SecureRequestCustomizer());
ConnectionFactory[] connectionFactories;
Collection<Transport> transports = port.getTransports();
SslContextFactory.Server sslContextFactory = null;
if (!transports.contains(Transport.SSL))
{
connectionFactories = new ConnectionFactory[]{httpConnectionFactory};
}
else if (transports.contains(Transport.SSL))
{
sslContextFactory = createSslContextFactory(port);
ConnectionFactory sslConnectionFactory =
new SslConnectionFactory(sslContextFactory, httpConnectionFactory.getProtocol());
if (port.getTransports().contains(Transport.TCP))
{
sslConnectionFactory = new DetectorConnectionFactory((ConnectionFactory.Detecting) sslConnectionFactory);
}
connectionFactories = new ConnectionFactory[]{sslConnectionFactory, httpConnectionFactory};
}
else
{
throw new IllegalArgumentException("Unexpected transport on port " + port.getName() + ":" + transports);
}
final ServerConnector connector = new ServerConnector(server,
new QBBTrackingThreadPool(port.getThreadPoolMaximum(),
port.getThreadPoolMinimum()),
null,
null,
port.getDesiredNumberOfAcceptors(),
port.getDesiredNumberOfSelectors(),
connectionFactories)
{
@Override
public void open() throws IOException
{
try
{
super.open();
}
catch (BindException e)
{
_sslContextFactoryMap.remove(port);
InetSocketAddress addr = getHost() == null ? new InetSocketAddress(getPort())
: new InetSocketAddress(getHost(), getPort());
throw new PortBindFailureException(addr);
}
}
};
connector.setAcceptQueueSize(port.getAcceptBacklogSize());
final String bindingAddress = port.getBindingAddress();
if (bindingAddress != null && !bindingAddress.trim().equals("") && !bindingAddress.trim().equals("*"))
{
connector.setHost(bindingAddress.trim());
}
connector.setPort(port.getPort());
if (transports.contains(Transport.SSL))
{
connector.addBean(new SslHandshakeListener()
{
@Override
public void handshakeFailed(final Event event, final Throwable failure)
{
final SSLEngine sslEngine = event.getSSLEngine();
if (LOGGER.isDebugEnabled())
{
LOGGER.info("TLS handshake failed: host='{}', port={}",
sslEngine.getPeerHost(),
sslEngine.getPeerPort(),
failure);
}
else
{
LOGGER.info("TLS handshake failed: host='{}', port={}: {}",
sslEngine.getPeerHost(),
sslEngine.getPeerPort(),
String.valueOf(failure));
}
}
});
}
final int acceptors = connector.getAcceptors();
final int selectors = connector.getSelectorManager().getSelectorCount();
if (LOGGER.isDebugEnabled())
{
LOGGER.debug(
"Created connector for http port {} with maxThreads={}, minThreads={}, acceptors={}, selectors={}, acceptBacklog={}",
port.getName(),
port.getThreadPoolMaximum(),
port.getThreadPoolMinimum(),
acceptors,
selectors,
port.getAcceptBacklogSize());
}
final int requiredNumberOfConnections = acceptors + 2 * selectors + 1;
if (port.getThreadPoolMaximum() < requiredNumberOfConnections)
{
throw new IllegalConfigurationException(String.format(
"Insufficient number of threads is configured on http port '%s': max=%d < needed(acceptors=%d + selectors=2*%d + request=1)",
port.getName(),
port.getThreadPoolMaximum(),
acceptors,
selectors));
}
if (sslContextFactory != null)
{
_sslContextFactoryMap.put(port, sslContextFactory);
}
return connector;
}