/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.atlas.web.service; import org.apache.atlas.AtlasConfiguration; import org.apache.atlas.AtlasErrorCode; import org.apache.atlas.exception.AtlasBaseException; import org.eclipse.jetty.server.Connector; import org.eclipse.jetty.server.HttpConfiguration; import org.eclipse.jetty.server.HttpConnectionFactory; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.ServerConnector; import org.eclipse.jetty.util.thread.ExecutorThreadPool; import org.eclipse.jetty.webapp.WebAppContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.TimeUnit; /** * This class embeds a Jetty server and a connector. */ public class EmbeddedServer { public static final Logger LOG = LoggerFactory.getLogger(EmbeddedServer.class); protected final Server server; public EmbeddedServer(int port, String path) throws IOException { int queueSize = AtlasConfiguration.WEBSERVER_QUEUE_SIZE.getInt(); LinkedBlockingQueue<Runnable> queue = new LinkedBlockingQueue<>(queueSize); int minThreads = AtlasConfiguration.WEBSERVER_MIN_THREADS.getInt(); int maxThreads = AtlasConfiguration.WEBSERVER_MAX_THREADS.getInt(); long keepAliveTime = AtlasConfiguration.WEBSERVER_KEEPALIVE_SECONDS.getLong(); ExecutorThreadPool pool = new ExecutorThreadPool(minThreads, maxThreads, keepAliveTime, TimeUnit.SECONDS, queue); server = new Server(pool); Connector connector = getConnector(port); server.addConnector(connector); WebAppContext application = getWebAppContext(path); server.setHandler(application); } protected WebAppContext getWebAppContext(String path) { WebAppContext application = new WebAppContext(path, "/"); application.setClassLoader(Thread.currentThread().getContextClassLoader()); // Disable directory listing application.setInitParameter("org.eclipse.jetty.servlet.Default.dirAllowed", "false"); return application; } public static EmbeddedServer newServer(int port, String path, boolean secure) throws IOException { if (secure) { return new SecureEmbeddedServer(port, path); } else { return new EmbeddedServer(port, path); } } protected Connector getConnector(int port) throws IOException { HttpConfiguration http_config = new HttpConfiguration(); // this is to enable large header sizes when Kerberos is enabled with AD final int bufferSize = AtlasConfiguration.WEBSERVER_REQUEST_BUFFER_SIZE.getInt();; http_config.setResponseHeaderSize(bufferSize); http_config.setRequestHeaderSize(bufferSize); ServerConnector connector = new ServerConnector(server, new HttpConnectionFactory(http_config)); connector.setPort(port); connector.setHost("0.0.0.0"); return connector; } public void start() throws AtlasBaseException { try { server.start(); server.join(); } catch(Exception e) { throw new AtlasBaseException(AtlasErrorCode.EMBEDDED_SERVER_START, e); } } public void stop() { try { server.stop(); } catch (Exception e) { LOG.warn("Error during shutdown", e); } } }