X-Git-Url: https://git.nmode.ca/signal-cli/blobdiff_plain/1ad0e94b640d16a8d832287362e1785c78d3ec49..36abb8ae8f9bdedff1bdc251c049890026700e59:/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 b2544b25..32000a1f 100644 --- a/src/main/java/org/asamk/signal/http/HttpServerHandler.java +++ b/src/main/java/org/asamk/signal/http/HttpServerHandler.java @@ -40,56 +40,14 @@ public class HttpServerHandler { } public void init() throws IOException { + logger.info("Starting server on " + address.toString()); - logger.info("Starting server on " + address.toString()); + final var server = HttpServer.create(address, 0); + server.setExecutor(Executors.newFixedThreadPool(10)); - final var server = HttpServer.create(address, 0); - server.setExecutor(Executors.newFixedThreadPool(10)); - - server.createContext("/api/v1/rpc", httpExchange -> { - - if (!"POST".equals(httpExchange.getRequestMethod())) { - sendResponse(405, null, httpExchange); - return; - } - - if (!"application/json".equals(httpExchange.getRequestHeaders().getFirst("Content-Type"))) { - sendResponse(415, null, httpExchange); - return; - } - - try { - - final Object[] result = {null}; - final var jsonRpcSender = new JsonRpcSender(s -> { - if (result[0] != null) { - throw new AssertionError("There should only be a single JSON-RPC response"); - } - - result[0] = s; - }); - - final var jsonRpcReader = new JsonRpcReader(jsonRpcSender, httpExchange.getRequestBody()); - jsonRpcReader.readMessages((method, params) -> commandHandler.handleRequest(objectMapper, method, params), - response -> logger.debug("Received unexpected response for id {}", response.getId())); - - if (result[0] !=null) { - sendResponse(200, result[0], httpExchange); - } else { - sendResponse(201, null, httpExchange); - } - - } - catch (Throwable aEx) { - logger.error("Failed to process request.", aEx); - sendResponse(200, JsonRpcResponse.forError( - new JsonRpcResponse.Error(JsonRpcResponse.Error.INTERNAL_ERROR, - "An internal server error has occurred.", null), null), httpExchange); - } - }); - - server.start(); + server.createContext("/api/v1/rpc", this::handleRpcEndpoint); + server.start(); } private void sendResponse(int status, Object response, HttpExchange httpExchange) throws IOException { @@ -101,10 +59,55 @@ public class HttpServerHandler { httpExchange.getResponseBody().write(byteResponse); } else { - httpExchange.sendResponseHeaders(status, 0); + httpExchange.sendResponseHeaders(status, -1); } httpExchange.getResponseBody().close(); } + private void handleRpcEndpoint(HttpExchange httpExchange) throws IOException { + if (!"/api/v1/rpc".equals(httpExchange.getRequestURI().getPath())) { + sendResponse(404, null, httpExchange); + return; + } + if (!"POST".equals(httpExchange.getRequestMethod())) { + sendResponse(405, null, httpExchange); + return; + } + + if (!"application/json".equals(httpExchange.getRequestHeaders().getFirst("Content-Type"))) { + sendResponse(415, null, httpExchange); + return; + } + + try { + + final Object[] result = {null}; + final var jsonRpcSender = new JsonRpcSender(s -> { + if (result[0] != null) { + throw new AssertionError("There should only be a single JSON-RPC response"); + } + + result[0] = s; + }); + + final var jsonRpcReader = new JsonRpcReader(jsonRpcSender, httpExchange.getRequestBody()); + jsonRpcReader.readMessages((method, params) -> commandHandler.handleRequest(objectMapper, method, params), + response -> logger.debug("Received unexpected response for id {}", response.getId())); + + if (result[0] != null) { + sendResponse(200, result[0], httpExchange); + } else { + sendResponse(201, null, httpExchange); + } + + } catch (Throwable aEx) { + logger.error("Failed to process request.", aEx); + sendResponse(200, + JsonRpcResponse.forError(new JsonRpcResponse.Error(JsonRpcResponse.Error.INTERNAL_ERROR, + "An internal server error has occurred.", + null), null), + httpExchange); + } + } }