package org.webpieces.frontend2.impl; import java.util.concurrent.ScheduledExecutorService; import org.webpieces.asyncserver.api.AsyncServer; import org.webpieces.asyncserver.api.AsyncServerManager; import org.webpieces.frontend2.api.FrontendConfig; import org.webpieces.frontend2.api.HttpFrontendManager; import org.webpieces.frontend2.api.HttpRequestListener; import org.webpieces.frontend2.api.HttpServer; import org.webpieces.httpparser.api.HttpParser; import org.webpieces.nio.api.SSLEngineFactory; import org.webpieces.util.logging.Logger; import org.webpieces.util.logging.LoggerFactory; import com.webpieces.http2engine.api.server.Http2ServerEngineFactory; public class FrontEndServerManagerImpl implements HttpFrontendManager { private static final Logger log = LoggerFactory.getLogger(FrontEndServerManagerImpl.class); private AsyncServerManager svrManager; private ScheduledExecutorService timer; private HttpParser httpParser; private Http2ServerEngineFactory http2EngineFactory; public FrontEndServerManagerImpl( AsyncServerManager svrManager, ScheduledExecutorService svc, Http2ServerEngineFactory http2EngineFactory, HttpParser httpParser) { this.timer = svc; this.svrManager = svrManager; this.http2EngineFactory = http2EngineFactory; this.httpParser = httpParser; } @Override public HttpServer createHttpServer(FrontendConfig config, HttpRequestListener httpListener) { preconditionCheck(config); Layer1ServerListener listener = buildDatalListener(httpListener, false); AsyncServer tcpServer = svrManager.createTcpServer(config.asyncServerConfig, listener); HttpServerImpl frontend = new HttpServerImpl(tcpServer, config); return frontend; } private Layer1ServerListener buildDatalListener(HttpRequestListener httpListener, boolean isHttps) { Layer2Http1_1Handler http1_1 = new Layer2Http1_1Handler(httpParser, httpListener, isHttps); Layer2Http2Handler http2 = new Layer2Http2Handler(http2EngineFactory, httpListener, isHttps); Layer1ServerListener listener = new Layer1ServerListener(http1_1, http2); return listener; } private void preconditionCheck(FrontendConfig config) { if(config.bindAddress == null) throw new IllegalArgumentException("config.bindAddress must be set"); if(config.keepAliveTimeoutMs != null && timer == null) throw new IllegalArgumentException("keepAliveTimeoutMs must be null since no timer was given when HttpFrontendFactory.createFrontEnd was called"); else if(config.maxConnectToRequestTimeoutMs != null && timer == null) throw new IllegalArgumentException("keepAliveTimeoutMs must be null since no timer was given when HttpFrontendFactory.createFrontEnd was called"); } @Override public HttpServer createHttpsServer(FrontendConfig config, HttpRequestListener httpListener, SSLEngineFactory factory) { preconditionCheck(config); Layer1ServerListener listener = buildDatalListener(httpListener, true); AsyncServer tcpServer = svrManager.createTcpServer(config.asyncServerConfig, listener, factory); HttpServerImpl frontend = new HttpServerImpl(tcpServer, config); return frontend; } }