]> nmode's Git Repositories - signal-cli/blobdiff - src/main/java/org/asamk/signal/http/HttpServerHandler.java
Fix length for empty response to prevent chunked stream
[signal-cli] / src / main / java / org / asamk / signal / http / HttpServerHandler.java
index b2544b25c799ea6d488d84940bb31a0b7b6ef655..a5213df7a0e80f71dea2a8798946dfe6f39d5347 100644 (file)
@@ -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,51 @@ 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 (!"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);
+        }
+    }
 }