public static NetServer server(IPersistentMap config) throws IOException {
String ip = coerceStr(config.valAt(IP, "0.0.0.0"), HttpProtocol.RE_IPV4_ADDR);
int port = coerceInt(config.valAt(PORT, 8090));
int nthreads = coerceInt(config.valAt(WORKER_THREADS, 4));
String iothread = coerceStr(config.valAt(IOTHREAD_NAME_PREFIX, "netkit-io"), null);
final IFn fn = NetkitUtil.coerceObj(config.valAt(HANDLER), IFn.class, "Invalid handler function");
final ExecutorService executor = Executors.newFixedThreadPool(nthreads);
final HttpConfig htconfig = new HttpConfig();
htconfig.setKeepAliveTimeout(coerceInt(config.valAt(KEEP_ALIVE, HttpConfig.KEEP_ALIVE)));
htconfig.setMaxBodySize(coerceInt(config.valAt(MAX_BODY, HttpConfig.MAX_BODY_SIZE)));
htconfig.setMaxLineSize(coerceInt(config.valAt(MAX_LINE, HttpConfig.MAX_LINE_SIZE)));
SSLContext sslctx = null;
if (coerceBool(config.valAt(TLS, false))) {
sslctx = TlsContextBuilder.svrContext(
coerceStr(config.valAt(KEYSTORE, "ssl.jks"), null),
coerceStr(config.valAt(KEYSTORE_PASS, "changeit"), null));
}
BufHandlerFactory factory = new BufHandlerFactory() {
@Override
public BufHandler create(SocketChannel ch) {
return new HttpProtocolHandler(htconfig,
new RingHandler(htconfig, fn, executor));
}
};
return new NetServer(iothread, ip, port, factory, sslctx);
}