| | |
| | | import java.util.Collections; |
| | | import java.util.Iterator; |
| | | import java.util.LinkedHashMap; |
| | | import java.util.LinkedList; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | import java.util.Objects; |
| | |
| | | /** Indicates whether this connection handler is enabled. */ |
| | | private boolean enabled; |
| | | |
| | | /** The set of listeners for this connection handler. */ |
| | | private final List<HostPort> listeners = new LinkedList<>(); |
| | | /** The addresses and the port the HTTP server listens on, or starts with next. */ |
| | | private volatile List<HostPort> listeners = Collections.emptyList(); |
| | | |
| | | /** The HTTP server embedded in OpenDJ. */ |
| | | private HttpServer httpServer; |
| | |
| | | friendlyName = config.name(); |
| | | } |
| | | |
| | | int listenPort = config.getListenPort(); |
| | | for (InetAddress a : config.getListenAddress()) |
| | | { |
| | | listeners.add(new HostPort(a.getHostAddress(), listenPort)); |
| | | } |
| | | listeners = toListeners(config); |
| | | |
| | | handlerName = getHandlerName(config); |
| | | |
| | |
| | | this.httpServer = createHttpServer(); |
| | | this.httpServer.getServerConfiguration().addHttpHandler(newGrizzlyHttpHandler(new RootHttpApplication())); |
| | | logger.trace("Starting HTTP server..."); |
| | | this.httpServer.start(); |
| | | try |
| | | { |
| | | this.httpServer.start(); |
| | | } |
| | | catch (IOException | RuntimeException e) |
| | | { |
| | | // HttpServer.start() stops at the first listener that cannot bind and leaves the listeners started before it |
| | | // bound: release their addresses, since the caller only forgets about the server. |
| | | this.httpServer.shutdownNow(); |
| | | throw e; |
| | | } |
| | | logger.trace("HTTP server started"); |
| | | logger.info(NOTE_CONNHANDLER_STARTED_LISTENING, handlerName); |
| | | } |
| | |
| | | setHttpStatsProbe(server); |
| | | } |
| | | |
| | | // Configure the network listener |
| | | final NetworkListener listener = new NetworkListener( |
| | | "OpenDJ-HTTP", NetworkListener.DEFAULT_NETWORK_HOST, initConfig.getListenPort()); |
| | | server.addListener(listener); |
| | | // Configure one network listener per listen address, and report them: a configuration change can replace |
| | | // initConfig after the initialization. HttpServer keys its listeners by name, and each listener owns its |
| | | // transport, so neither can be shared. |
| | | listeners = toListeners(initConfig); |
| | | final int numRequestHandlers = getNumRequestHandlers(currentConfig.getNumRequestHandlers(), friendlyName); |
| | | for (InetAddress address : initConfig.getListenAddress()) |
| | | { |
| | | final String host = address.getHostAddress(); |
| | | final NetworkListener listener = new NetworkListener("OpenDJ-HTTP " + host, host, initConfig.getListenPort()); |
| | | server.addListener(listener); |
| | | configureTransport(listener.getTransport(), numRequestHandlers); |
| | | |
| | | // Configure the network transport |
| | | final TCPNIOTransport transport = listener.getTransport(); |
| | | // Configure SSL |
| | | if (sslEngineConfigurator != null) |
| | | { |
| | | listener.setSecure(true); |
| | | listener.setSSLEngineConfig(sslEngineConfigurator); |
| | | } |
| | | } |
| | | |
| | | return server; |
| | | } |
| | | |
| | | private static List<HostPort> toListeners(HTTPConnectionHandlerCfg config) |
| | | { |
| | | final List<HostPort> hostPorts = new ArrayList<>(); |
| | | for (InetAddress address : config.getListenAddress()) |
| | | { |
| | | hostPorts.add(new HostPort(address.getHostAddress(), config.getListenPort())); |
| | | } |
| | | return Collections.unmodifiableList(hostPorts); |
| | | } |
| | | |
| | | private void configureTransport(TCPNIOTransport transport, int numRequestHandlers) |
| | | { |
| | | transport.setReuseAddress(currentConfig.isAllowTCPReuseAddress()); |
| | | transport.setKeepAlive(currentConfig.isUseTCPKeepAlive()); |
| | | transport.setTcpNoDelay(currentConfig.isUseTCPNoDelay()); |
| | |
| | | transport.setWriteBufferSize(bufferSize); |
| | | transport.setIOStrategy(SameThreadIOStrategy.getInstance()); |
| | | |
| | | final int numRequestHandlers = getNumRequestHandlers(currentConfig.getNumRequestHandlers(), friendlyName); |
| | | transport.setSelectorRunnersCount(numRequestHandlers); |
| | | transport.setServerConnectionBackLog(currentConfig.getAcceptBacklog()); |
| | | |
| | | // Configure SSL |
| | | if (sslEngineConfigurator != null) |
| | | { |
| | | listener.setSecure(true); |
| | | listener.setSSLEngineConfig(sslEngineConfigurator); |
| | | } |
| | | |
| | | return server; |
| | | } |
| | | |
| | | private void setHttpStatsProbe(HttpServer server) |