From f8652ad1b96221262b42780b4e82905f58045bdc Mon Sep 17 00:00:00 2001 From: Aurora Lahtela <24460436+AuroraLS3@users.noreply.github.com> Date: Sun, 19 Jun 2022 18:40:25 +0300 Subject: [PATCH] Delete Sun Webserver implementation --- .../webserver/http/SunInternalRequest.java | 112 ------- .../webserver/http/SunRequestHandler.java | 95 ------ .../webserver/http/SunResponseSender.java | 122 ------- .../delivery/webserver/http/SunWebServer.java | 314 ------------------ 4 files changed, 643 deletions(-) delete mode 100644 Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/http/SunInternalRequest.java delete mode 100644 Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/http/SunRequestHandler.java delete mode 100644 Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/http/SunResponseSender.java delete mode 100644 Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/http/SunWebServer.java diff --git a/Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/http/SunInternalRequest.java b/Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/http/SunInternalRequest.java deleted file mode 100644 index 26fc771f18..0000000000 --- a/Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/http/SunInternalRequest.java +++ /dev/null @@ -1,112 +0,0 @@ -/* - * This file is part of Player Analytics (Plan). - * - * Plan is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License v3 as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Plan is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with Plan. If not, see . - */ -package com.djrapitops.plan.delivery.webserver.http; - -import com.djrapitops.plan.delivery.web.resolver.request.Request; -import com.djrapitops.plan.delivery.web.resolver.request.URIPath; -import com.djrapitops.plan.delivery.web.resolver.request.URIQuery; -import com.djrapitops.plan.delivery.web.resolver.request.WebUser; -import com.djrapitops.plan.delivery.webserver.auth.AuthenticationExtractor; -import com.djrapitops.plan.delivery.webserver.auth.Cookie; -import com.djrapitops.plan.delivery.webserver.configuration.WebserverConfiguration; -import com.sun.net.httpserver.HttpExchange; -import org.apache.commons.text.TextStringBuilder; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class SunInternalRequest implements InternalRequest { - - private final HttpExchange exchange; - private final WebserverConfiguration webserverConfiguration; - private final AuthenticationExtractor authenticationExtractor; - - public SunInternalRequest(HttpExchange exchange, WebserverConfiguration webserverConfiguration, AuthenticationExtractor authenticationExtractor) { - this.exchange = exchange; - this.webserverConfiguration = webserverConfiguration; - this.authenticationExtractor = authenticationExtractor; - } - - @Override - public String getAccessAddressFromSocketIp() { - return exchange.getRemoteAddress().getAddress().getHostAddress(); - } - - @Override - public String getAccessAddressFromHeader() { - return exchange.getRequestHeaders().getFirst("X-Forwarded-For"); - } - - @Override - public String getRequestedURIString() { - return exchange.getRequestURI().toASCIIString(); - } - - @Override - public Request toRequest() { - return buildRequest(exchange); - } - - private Request buildRequest(HttpExchange exchange) { - String requestMethod = exchange.getRequestMethod(); - URIPath path = new URIPath(exchange.getRequestURI().getPath()); - URIQuery query = new URIQuery(exchange.getRequestURI().getRawQuery()); - byte[] requestBody = readRequestBody(exchange); - WebUser user = getWebUser(webserverConfiguration, authenticationExtractor); - Map headers = getRequestHeaders(exchange); - return new Request(requestMethod, path, query, user, headers, requestBody); - } - - private byte[] readRequestBody(HttpExchange exchange) { - try (ByteArrayOutputStream buf = new ByteArrayOutputStream(512)) { - int b; - while ((b = exchange.getRequestBody().read()) != -1) { - buf.write((byte) b); - } - return buf.toByteArray(); - } catch (IOException ignored) { - // requestBody stays empty - return new byte[0]; - } - } - - private Map getRequestHeaders(HttpExchange exchange) { - Map headers = new HashMap<>(); - for (Map.Entry> e : exchange.getRequestHeaders().entrySet()) { - List value = e.getValue(); - headers.put(e.getKey(), new TextStringBuilder().appendWithSeparators(value, ";").build()); - } - return headers; - } - - @Override - public List getCookies() { - List textCookies = exchange.getRequestHeaders().get("Cookie"); - List cookies = new ArrayList<>(); - if (textCookies != null && !textCookies.isEmpty()) { - String[] separated = new TextStringBuilder().appendWithSeparators(textCookies, ";").build().split(";"); - for (String textCookie : separated) { - cookies.add(new Cookie(textCookie)); - } - } - return cookies; - } -} diff --git a/Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/http/SunRequestHandler.java b/Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/http/SunRequestHandler.java deleted file mode 100644 index 8adf75a0a1..0000000000 --- a/Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/http/SunRequestHandler.java +++ /dev/null @@ -1,95 +0,0 @@ -/* - * This file is part of Player Analytics (Plan). - * - * Plan is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License v3 as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Plan is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with Plan. If not, see . - */ -package com.djrapitops.plan.delivery.webserver.http; - -import com.djrapitops.plan.delivery.web.resolver.Response; -import com.djrapitops.plan.delivery.webserver.Addresses; -import com.djrapitops.plan.delivery.webserver.ResponseResolver; -import com.djrapitops.plan.delivery.webserver.auth.AuthenticationExtractor; -import com.djrapitops.plan.delivery.webserver.configuration.WebserverConfiguration; -import com.djrapitops.plan.settings.config.PlanConfig; -import com.djrapitops.plan.settings.config.paths.PluginSettings; -import com.djrapitops.plan.utilities.logging.ErrorContext; -import com.djrapitops.plan.utilities.logging.ErrorLogger; -import com.sun.net.httpserver.HttpExchange; -import com.sun.net.httpserver.HttpHandler; -import net.playeranalytics.plugin.server.PluginLogger; - -import javax.inject.Inject; -import javax.inject.Singleton; - -/** - * HttpHandler for WebServer request management. - * - * @author AuroraLS3 - */ -@Singleton -public class SunRequestHandler implements HttpHandler { - - private final PlanConfig config; - private final Addresses addresses; - private final WebserverConfiguration webserverConfiguration; - private final AuthenticationExtractor authenticationExtractor; - private final ResponseResolver responseResolver; - private final RequestHandler requestHandler; - private final PluginLogger logger; - private final ErrorLogger errorLogger; - - @Inject - public SunRequestHandler( - PlanConfig config, - Addresses addresses, - WebserverConfiguration webserverConfiguration, - AuthenticationExtractor authenticationExtractor, - ResponseResolver responseResolver, - RequestHandler requestHandler, - PluginLogger logger, - ErrorLogger errorLogger - ) { - this.config = config; - this.addresses = addresses; - this.webserverConfiguration = webserverConfiguration; - this.authenticationExtractor = authenticationExtractor; - this.responseResolver = responseResolver; - this.requestHandler = requestHandler; - this.logger = logger; - this.errorLogger = errorLogger; - } - - @Override - public void handle(HttpExchange exchange) { - try { - InternalRequest internalRequest = new SunInternalRequest(exchange, webserverConfiguration, authenticationExtractor); - Response response = requestHandler.getResponse(internalRequest); - new SunResponseSender(addresses, exchange, response).send(); - } catch (Exception e) { - if (config.isTrue(PluginSettings.DEV_MODE)) { - logger.warn("THIS ERROR IS ONLY LOGGED IN DEV MODE:"); - errorLogger.warn(e, ErrorContext.builder() - .whatToDo("THIS ERROR IS ONLY LOGGED IN DEV MODE") - .related(exchange.getRequestMethod(), exchange.getRemoteAddress(), exchange.getRequestHeaders(), exchange.getResponseHeaders(), exchange.getRequestURI()) - .build()); - } - } finally { - exchange.close(); - } - } - - public ResponseResolver getResponseResolver() { - return responseResolver; - } -} diff --git a/Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/http/SunResponseSender.java b/Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/http/SunResponseSender.java deleted file mode 100644 index e228dad4df..0000000000 --- a/Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/http/SunResponseSender.java +++ /dev/null @@ -1,122 +0,0 @@ -/* - * This file is part of Player Analytics (Plan). - * - * Plan is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License v3 as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Plan is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with Plan. If not, see . - */ -package com.djrapitops.plan.delivery.webserver.http; - -import com.djrapitops.plan.delivery.web.resolver.Response; -import com.djrapitops.plan.delivery.webserver.Addresses; -import com.sun.net.httpserver.Headers; -import com.sun.net.httpserver.HttpExchange; - -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.io.OutputStream; -import java.util.Map; -import java.util.zip.GZIPOutputStream; - -/** - * Utility for sending a Response to HttpExchange. - * - * @author AuroraLS3 - */ -public class SunResponseSender { - - private final Addresses addresses; - private final HttpExchange exchange; - private final Response response; - - public SunResponseSender(Addresses addresses, HttpExchange exchange, Response response) { - this.addresses = addresses; - this.exchange = exchange; - this.response = response; - } - - public void send() throws IOException { - setResponseHeaders(); - if ("HEAD".equals(exchange.getRequestMethod()) || response.getCode() == 204) { - sendHeadResponse(); - } else if ("bytes".equalsIgnoreCase(response.getHeaders().get("Accept-Ranges"))) { - sendRawBytes(); - } else { - sendCompressed(); - } - } - - public void sendHeadResponse() throws IOException { - try { - exchange.getResponseHeaders().remove("Content-Length"); - beginSend(); - } finally { - exchange.getRequestBody().close(); - } - } - - private void setResponseHeaders() { - Headers headers = exchange.getResponseHeaders(); - - Map responseHeaders = response.getHeaders(); - correctRedirect(responseHeaders); - - for (Map.Entry header : responseHeaders.entrySet()) { - headers.set(header.getKey(), header.getValue()); - } - } - - private void correctRedirect(Map responseHeaders) { - String redirect = responseHeaders.get("Location"); - if (redirect != null) { - if (redirect.startsWith("http") || !redirect.startsWith("/")) return; - addresses.getAccessAddress().ifPresent(address -> responseHeaders.put("Location", address + redirect)); - } - } - - private void sendCompressed() throws IOException { - exchange.getResponseHeaders().set("Content-Encoding", "gzip"); - beginSend(); - try (OutputStream out = new GZIPOutputStream(exchange.getResponseBody())) { - send(out); - } - } - - private void beginSend() throws IOException { - String length = response.getHeaders().get("Content-Length"); - if (length == null || "0".equals(length)) { - exchange.getResponseHeaders().remove("Content-Length"); - } - // Return a content length of -1 for HTTP code 204 (No content) - // and HEAD requests to avoid warning messages. - exchange.sendResponseHeaders(response.getCode(), (response.getCode() == 204 || "HEAD".equals(exchange.getRequestMethod()) || length == null) ? -1 : Long.parseLong(length)); - } - - private void sendRawBytes() throws IOException { - beginSend(); - try (OutputStream out = exchange.getResponseBody()) { - send(out); - } - } - - private void send(OutputStream out) throws IOException { - try ( - ByteArrayInputStream bis = new ByteArrayInputStream(response.getBytes()) - ) { - byte[] buffer = new byte[2048]; - int count; - while ((count = bis.read(buffer)) != -1) { - out.write(buffer, 0, count); - } - } - } -} \ No newline at end of file diff --git a/Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/http/SunWebServer.java b/Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/http/SunWebServer.java deleted file mode 100644 index 6aa8d34c87..0000000000 --- a/Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/http/SunWebServer.java +++ /dev/null @@ -1,314 +0,0 @@ -/* - * This file is part of Player Analytics (Plan). - * - * Plan is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License v3 as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Plan is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with Plan. If not, see . - */ -package com.djrapitops.plan.delivery.webserver.http; - -import com.djrapitops.plan.delivery.webserver.Addresses; -import com.djrapitops.plan.settings.config.PlanConfig; -import com.djrapitops.plan.settings.config.paths.PluginSettings; -import com.djrapitops.plan.settings.config.paths.WebserverSettings; -import com.djrapitops.plan.settings.locale.Locale; -import com.djrapitops.plan.settings.locale.lang.PluginLang; -import com.djrapitops.plan.storage.file.PlanFiles; -import com.djrapitops.plan.utilities.logging.ErrorContext; -import com.djrapitops.plan.utilities.logging.ErrorLogger; -import com.sun.net.httpserver.HttpServer; -import com.sun.net.httpserver.HttpsConfigurator; -import com.sun.net.httpserver.HttpsParameters; -import com.sun.net.httpserver.HttpsServer; -import net.playeranalytics.plugin.server.PluginLogger; -import org.apache.commons.lang3.concurrent.BasicThreadFactory; - -import javax.inject.Inject; -import javax.inject.Singleton; -import javax.net.ssl.*; -import java.io.*; -import java.net.BindException; -import java.net.InetSocketAddress; -import java.nio.file.InvalidPathException; -import java.nio.file.Paths; -import java.security.*; -import java.security.cert.Certificate; -import java.security.cert.CertificateException; -import java.util.concurrent.*; - -/** - * @author AuroraLS3 - */ -@Singleton -public class SunWebServer implements WebServer { - - private final Locale locale; - private final PlanFiles files; - private final PlanConfig config; - - private final Addresses addresses; - private final SunRequestHandler requestHandler; - - private final PluginLogger logger; - private final ErrorLogger errorLogger; - - private int port; - private boolean enabled = false; - private HttpServer server; - - private boolean usingHttps = false; - - @Inject - public SunWebServer( - Locale locale, - PlanFiles files, - PlanConfig config, - Addresses addresses, - PluginLogger logger, - ErrorLogger errorLogger, - SunRequestHandler requestHandler - ) { - this.locale = locale; - this.files = files; - this.config = config; - this.addresses = addresses; - - this.requestHandler = requestHandler; - - this.logger = logger; - this.errorLogger = errorLogger; - } - - @Override - public void enable() { - this.port = config.get(WebserverSettings.PORT); - - initServer(); - - if (addresses.getAccessAddress().isEmpty()) { - logger.warn(locale.getString(PluginLang.ENABLE_NOTIFY_BAD_IP)); - } - - if (!isEnabled()) { - if (config.isTrue(WebserverSettings.DISABLED)) { - logger.info(locale.getString(PluginLang.ENABLE_NOTIFY_WEB_SERVER_DISABLED)); - } else { - logger.error(locale.getString(PluginLang.WEB_SERVER_FAIL_PORT_BIND, port)); - } - } else if (config.isTrue(WebserverSettings.IP_WHITELIST)) { - logger.info(locale.getString(PluginLang.WEB_SERVER_NOTIFY_IP_WHITELIST)); - } - - requestHandler.getResponseResolver().registerPages(); - } - - /** - * Starts up the WebServer in a new Thread Pool. - */ - private void initServer() { - if (config.isTrue(WebserverSettings.DISABLED)) { - // WebServer has been disabled. - return; - } - - if (enabled) { - // Server is already enabled stop code - return; - } - - try { - usingHttps = startHttpsServer(); - - if (!usingHttps) { - logger.info("§e" + locale.getString(PluginLang.WEB_SERVER_NOTIFY_HTTP_USER_AUTH)); - server = HttpServer.create(new InetSocketAddress(config.get(WebserverSettings.INTERNAL_IP), port), 10); - } else if (server == null) { - logger.info("§e" + locale.getString(PluginLang.WEB_SERVER_NOTIFY_USING_PROXY_MODE)); - server = HttpServer.create(new InetSocketAddress(config.get(WebserverSettings.INTERNAL_IP), port), 10); - } else if (config.isTrue(WebserverSettings.DISABLED_AUTHENTICATION)) { - logger.info(locale.getString(PluginLang.WEB_SERVER_NOTIFY_HTTPS_USER_AUTH)); - } - server.createContext("/", requestHandler); - - ExecutorService executor = new ThreadPoolExecutor( - 4, 8, 30, TimeUnit.SECONDS, new ArrayBlockingQueue<>(100), - new BasicThreadFactory.Builder() - .namingPattern("Plan WebServer Thread-%d") - .uncaughtExceptionHandler((thread, throwable) -> { - if (config.isTrue(PluginSettings.DEV_MODE)) { - errorLogger.warn(throwable, ErrorContext.builder() - .whatToDo("THIS ERROR IS ONLY LOGGED IN DEV MODE") - .build()); - } - }).build() - ); - server.setExecutor(executor); - server.start(); - - enabled = true; - - String address = addresses.getAccessAddress().orElse(addresses.getFallbackLocalhostAddress()); - logger.info(locale.getString(PluginLang.ENABLED_WEB_SERVER, server.getAddress().getPort(), address)); - - boolean usingAlternativeIP = config.isTrue(WebserverSettings.SHOW_ALTERNATIVE_IP); - if (!usingAlternativeIP && addresses.getAccessAddress().isEmpty()) { - logger.info("§e" + locale.getString(PluginLang.ENABLE_NOTIFY_EMPTY_IP)); - } - } catch (BindException failedToBind) { - logger.error("Webserver failed to bind port: " + failedToBind.toString()); - enabled = false; - } catch (IllegalArgumentException | IllegalStateException | IOException e) { - errorLogger.error(e, ErrorContext.builder().related("Trying to enable webserver", config.get(WebserverSettings.INTERNAL_IP) + ":" + port).build()); - enabled = false; - } - } - - private boolean startHttpsServer() throws BindException { - String keyStorePath = config.get(WebserverSettings.CERTIFICATE_PATH); - - if ("proxy".equalsIgnoreCase(keyStorePath)) { - return true; - } - - try { - if (!Paths.get(keyStorePath).isAbsolute()) { - keyStorePath = files.getDataFolder() + File.separator + keyStorePath; - } - } catch (InvalidPathException e) { - logger.error("WebServer: Could not find Keystore: " + e.getMessage()); - errorLogger.error(e, ErrorContext.builder() - .whatToDo(e.getMessage() + ", Fix this path to point to a valid keystore file: " + keyStorePath) - .related(keyStorePath).build()); - } - - char[] storepass = config.get(WebserverSettings.CERTIFICATE_STOREPASS).toCharArray(); - char[] keypass = config.get(WebserverSettings.CERTIFICATE_KEYPASS).toCharArray(); - String alias = config.get(WebserverSettings.CERTIFICATE_ALIAS); - - boolean startSuccessful = false; - String keyStoreKind = keyStorePath.endsWith(".p12") ? "PKCS12" : "JKS"; - try (FileInputStream fIn = new FileInputStream(keyStorePath)) { - KeyStore keystore = KeyStore.getInstance(keyStoreKind); - - keystore.load(fIn, storepass); - Certificate cert = keystore.getCertificate(alias); - - if (cert == null) { - throw new IllegalStateException("Alias: '" + alias + "' was not found in file " + keyStorePath + "."); - } - - logger.info("Certificate: " + cert.getType()); - - KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance("SunX509"); - keyManagerFactory.init(keystore, keypass); - - TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance("SunX509"); - trustManagerFactory.init(keystore); - - server = HttpsServer.create(new InetSocketAddress(config.get(WebserverSettings.INTERNAL_IP), port), 10); - SSLContext sslContext = SSLContext.getInstance("TLSv1.2"); - sslContext.init(keyManagerFactory.getKeyManagers(), null/*trustManagerFactory.getTrustManagers()*/, null); - - ((HttpsServer) server).setHttpsConfigurator(new HttpsConfigurator(sslContext) { - @Override - public void configure(HttpsParameters params) { - SSLEngine engine = sslContext.createSSLEngine(); - - params.setNeedClientAuth(false); - params.setCipherSuites(engine.getEnabledCipherSuites()); - params.setProtocols(engine.getEnabledProtocols()); - - SSLParameters defaultSSLParameters = sslContext.getDefaultSSLParameters(); - params.setSSLParameters(defaultSSLParameters); - } - }); - startSuccessful = true; - } catch (IllegalStateException e) { - logger.error(e.getMessage()); - } catch (KeyManagementException | NoSuchAlgorithmException e) { - logger.error(locale.getString(PluginLang.WEB_SERVER_FAIL_SSL_CONTEXT)); - errorLogger.error(e, ErrorContext.builder().related(keyStoreKind).build()); - } catch (EOFException e) { - logger.error(locale.getString(PluginLang.WEB_SERVER_FAIL_EMPTY_FILE)); - } catch (FileNotFoundException e) { - logger.info(locale.getString(PluginLang.WEB_SERVER_NOTIFY_NO_CERT_FILE, keyStorePath)); - logger.info(locale.getString(PluginLang.WEB_SERVER_NOTIFY_HTTP)); - } catch (BindException e) { - throw e; // Pass to above error handler - } catch (IOException e) { - errorLogger.error(e, ErrorContext.builder().related(config.get(WebserverSettings.INTERNAL_IP) + ":" + port).build()); - } catch (KeyStoreException | CertificateException | UnrecoverableKeyException e) { - logger.error(locale.getString(PluginLang.WEB_SERVER_FAIL_STORE_LOAD)); - errorLogger.error(e, ErrorContext.builder() - .whatToDo("Make sure the Certificate settings are correct / You can try remaking the keystore without -passin or -passout parameters.") - .related(keyStorePath).build()); - } - return startSuccessful; - } - - /** - * @return if the WebServer is enabled - */ - @Override - public boolean isEnabled() { - return enabled; - } - - /** - * Shuts down the server - Async thread is closed with shutdown boolean. - */ - @Override - public void disable() { - if (server != null) { - shutdown(); - logger.info(locale.getString(PluginLang.DISABLED_WEB_SERVER)); - } - enabled = false; - } - - private void shutdown() { - server.stop(0); - Executor executor = server.getExecutor(); - if (executor instanceof ExecutorService) { - ExecutorService service = (ExecutorService) executor; - service.shutdown(); - try { - if (!service.awaitTermination(5, TimeUnit.SECONDS)) { - service.shutdownNow(); - } - } catch (InterruptedException e) { - logger.error("WebServer ExecutorService shutdown thread interrupted on disable: " + e.getMessage()); - Thread.currentThread().interrupt(); - } - } - } - - @Override - public String getProtocol() { - return usingHttps ? "https" : "http"; - } - - @Override - public boolean isUsingHTTPS() { - return usingHttps; - } - - @Override - public boolean isAuthRequired() { - return isUsingHTTPS() && config.isFalse(WebserverSettings.DISABLED_AUTHENTICATION); - } - - @Override - public int getPort() { - return port; - } -}