X-Git-Url: https://git.nmode.ca/signal-cli/blobdiff_plain/15630356e18f59e8f4d29a5c9f215003ad07402e..7e9940be4ac1d3b7e19bcbd1e92b8db436415195:/src/main/java/org/asamk/signal/http/HttpServerHandler.java diff --git a/src/main/java/org/asamk/signal/http/HttpServerHandler.java b/src/main/java/org/asamk/signal/http/HttpServerHandler.java index f7d06b15..c9c8fa16 100644 --- a/src/main/java/org/asamk/signal/http/HttpServerHandler.java +++ b/src/main/java/org/asamk/signal/http/HttpServerHandler.java @@ -13,7 +13,6 @@ import org.asamk.signal.jsonrpc.SignalJsonRpcCommandHandler; import org.asamk.signal.manager.Manager; import org.asamk.signal.manager.MultiAccountManager; import org.asamk.signal.manager.api.Pair; -import org.asamk.signal.manager.util.Utils; import org.asamk.signal.util.Util; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -25,9 +24,9 @@ import java.util.Map; import java.util.concurrent.Executors; import java.util.concurrent.atomic.AtomicBoolean; -public class HttpServerHandler { +public class HttpServerHandler implements AutoCloseable { - private final static Logger logger = LoggerFactory.getLogger(HttpServerHandler.class); + private static final Logger logger = LoggerFactory.getLogger(HttpServerHandler.class); private final ObjectMapper objectMapper = Util.createJsonObjectMapper(); @@ -36,6 +35,8 @@ public class HttpServerHandler { private final SignalJsonRpcCommandHandler commandHandler; private final MultiAccountManager c; private final Manager m; + private HttpServer server; + private final AtomicBoolean shutdown = new AtomicBoolean(false); public HttpServerHandler(final InetSocketAddress address, final Manager m) { this.address = address; @@ -52,16 +53,34 @@ public class HttpServerHandler { } public void init() throws IOException { - logger.info("Starting server on " + address.toString()); + if (server != null) { + throw new AssertionError("HttpServerHandler already initialized"); + } + logger.debug("Starting HTTP server on {}", address); - final var server = HttpServer.create(address, 0); - server.setExecutor(Executors.newFixedThreadPool(10)); + server = HttpServer.create(address, 0); + server.setExecutor(Executors.newCachedThreadPool()); server.createContext("/api/v1/rpc", this::handleRpcEndpoint); server.createContext("/api/v1/events", this::handleEventsEndpoint); server.createContext("/api/v1/check", this::handleCheckEndpoint); server.start(); + logger.info("Started HTTP server on {}", address); + } + + @Override + public void close() { + if (server != null) { + shutdown.set(true); + synchronized (this) { + this.notifyAll(); + } + // Increase this delay when https://bugs.openjdk.org/browse/JDK-8304065 is fixed + server.stop(2); + server = null; + shutdown.set(false); + } } private void sendResponse(int status, Object response, HttpExchange httpExchange) throws IOException { @@ -138,7 +157,7 @@ public class HttpServerHandler { try { final var queryString = httpExchange.getRequestURI().getQuery(); - final var query = queryString == null ? Map.of() : Utils.getQueryMap(queryString); + final var query = queryString == null ? Map.of() : Util.getQueryMap(queryString); List managers = getManagerFromQuery(query); if (managers == null) { @@ -154,7 +173,7 @@ public class HttpServerHandler { final var handlers = subscribeReceiveHandlers(managers, sender, () -> { shouldStop.set(true); synchronized (this) { - this.notify(); + this.notifyAll(); } }); @@ -163,7 +182,7 @@ public class HttpServerHandler { synchronized (this) { wait(15_000); } - if (shouldStop.get()) { + if (shouldStop.get() || shutdown.get()) { break; } @@ -202,22 +221,22 @@ public class HttpServerHandler { } private List getManagerFromQuery(final Map query) { - List managers; if (m != null) { - managers = List.of(m); - } else { + return List.of(m); + } + if (c != null) { final var account = query.get("account"); if (account == null || account.isEmpty()) { - managers = c.getManagers(); + return c.getManagers(); } else { final var manager = c.getManager(account); if (manager == null) { return null; } - managers = List.of(manager); + return List.of(manager); } } - return managers; + throw new AssertionError("Unreachable state"); } private List> subscribeReceiveHandlers(