package org.webpieces.frontend.impl; import java.nio.ByteBuffer; import java.util.concurrent.CompletableFuture; import org.webpieces.asyncserver.api.AsyncServer; import org.webpieces.data.api.BufferPool; import org.webpieces.frontend.api.FrontendConfig; import org.webpieces.frontend.api.HttpServer; import org.webpieces.httpparser.api.HttpParser; import org.webpieces.httpparser.api.HttpParserFactory; import org.webpieces.nio.api.channels.TCPServerChannel; import org.webpieces.nio.api.handlers.AsyncDataListener; import org.webpieces.util.logging.Logger; import org.webpieces.util.logging.LoggerFactory; import com.webpieces.hpack.api.HpackParser; import com.webpieces.hpack.api.HpackParserFactory; public class HttpServerImpl implements HttpServer { private static final Logger log = LoggerFactory.getLogger(HttpServerImpl.class); private AsyncServer server; private AsyncDataListener dataListener; private FrontendConfig config; public HttpServerImpl(TimedRequestListener requestListener, BufferPool bufferPool, FrontendConfig config) { this.config = config; HttpParser httpParser = HttpParserFactory.createParser(bufferPool); HpackParser http2Parser = HpackParserFactory.createParser(bufferPool, true); // The http11layer can be stateless but the http2 engine needs to keep track of // state so we need a new http2engine for every connection.. So we can create the http11 // stuff here but we have to create http2 stuff in the serverdatalistener on // every new connection. Http11Layer http11Layer = new Http11Layer(httpParser, requestListener, config); Http11DataListener http11DataListener = new Http11DataListener(http11Layer); dataListener = new ServerDataListener(requestListener, http11DataListener, httpParser, http2Parser, config); } void init(AsyncServer asyncServer) { this.server = asyncServer; } AsyncDataListener getDataListener() { return dataListener; } @Override public void enableOverloadMode(ByteBuffer overloadResponse) { server.enableOverloadMode(overloadResponse); } @Override public void disableOverloadMode() { server.disableOverloadMode(); } @Override public TCPServerChannel getUnderlyingChannel() { return server.getUnderlyingChannel(); } @Override public void start() { log.info("starting to listen to port="+config.bindAddress); server.start(config.bindAddress); log.info("now listening for incoming requests"); } @Override public CompletableFuture<Void> close() { return server.closeServerChannel(); } }