X-Git-Url: https://git.nmode.ca/signal-cli/blobdiff_plain/ed8ac5b84ccea9dac672021aec74c26d035d17e4..c0aa338d7c8e40874dbc453b3fc3916701762029:/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 4d13e22c..6f8b1826 100644 --- a/src/main/java/org/asamk/signal/http/HttpServerHandler.java +++ b/src/main/java/org/asamk/signal/http/HttpServerHandler.java @@ -24,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(); @@ -35,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; @@ -51,9 +53,12 @@ public class HttpServerHandler { } public void init() throws IOException { + if (server != null) { + throw new AssertionError("HttpServerHandler already initialized"); + } logger.info("Starting server on " + address.toString()); - final var server = HttpServer.create(address, 0); + server = HttpServer.create(address, 0); server.setExecutor(Executors.newCachedThreadPool()); server.createContext("/api/v1/rpc", this::handleRpcEndpoint); @@ -153,7 +158,7 @@ public class HttpServerHandler { final var handlers = subscribeReceiveHandlers(managers, sender, () -> { shouldStop.set(true); synchronized (this) { - this.notify(); + this.notifyAll(); } }); @@ -162,7 +167,7 @@ public class HttpServerHandler { synchronized (this) { wait(15_000); } - if (shouldStop.get()) { + if (shouldStop.get() || shutdown.get()) { break; } @@ -201,22 +206,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; + return List.of(); } private List> subscribeReceiveHandlers( @@ -241,6 +246,20 @@ public class HttpServerHandler { m.removeReceiveHandler(handler); } + @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 interface Callable { void call();