]> nmode's Git Repositories - signal-cli/blobdiff - src/main/java/org/asamk/signal/jsonrpc/JsonRpcReader.java
Reexport dbus objects when self number changes
[signal-cli] / src / main / java / org / asamk / signal / jsonrpc / JsonRpcReader.java
index 67fced0ddfe34ef4cfbee253322f0fa87e0800cc..f3784a2c1d22e92df3e2a12e84dd288305dfa3be 100644 (file)
@@ -5,6 +5,7 @@ import com.fasterxml.jackson.databind.JsonMappingException;
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ContainerNode;
+import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.fasterxml.jackson.databind.node.ValueNode;
 
 import org.asamk.signal.util.Util;
@@ -15,7 +16,6 @@ import java.io.IOException;
 import java.util.Objects;
 import java.util.function.Consumer;
 import java.util.function.Supplier;
-import java.util.stream.Collectors;
 import java.util.stream.StreamSupport;
 
 public class JsonRpcReader {
@@ -34,22 +34,21 @@ public class JsonRpcReader {
         this.objectMapper = Util.createJsonObjectMapper();
     }
 
-    public void readRequests(
-            final RequestHandler requestHandler, final Consumer<JsonRpcResponse> responseHandler
-    ) {
+    public void readMessages(final RequestHandler requestHandler, final Consumer<JsonRpcResponse> responseHandler) {
         while (!Thread.interrupted()) {
             JsonRpcMessage message = readMessage();
             if (message == null) break;
 
-            if (message instanceof JsonRpcRequest) {
-                final var response = handleRequest(requestHandler, (JsonRpcRequest) message);
+            if (message instanceof final JsonRpcRequest jsonRpcRequest) {
+                logger.debug("Received json rpc request, method: " + jsonRpcRequest.getMethod());
+                final var response = handleRequest(requestHandler, jsonRpcRequest);
                 if (response != null) {
                     jsonRpcSender.sendResponse(response);
                 }
-            } else if (message instanceof JsonRpcResponse) {
-                responseHandler.accept((JsonRpcResponse) message);
+            } else if (message instanceof JsonRpcResponse jsonRpcResponse) {
+                responseHandler.accept(jsonRpcResponse);
             } else {
-                final var responseList = ((JsonRpcBulkMessage) message).getMessages().stream().map(jsonNode -> {
+                final var responseList = ((JsonRpcBatchMessage) message).getMessages().stream().map(jsonNode -> {
                     final JsonRpcRequest request;
                     try {
                         request = parseJsonRpcRequest(jsonNode);
@@ -58,9 +57,9 @@ public class JsonRpcReader {
                     }
 
                     return handleRequest(requestHandler, request);
-                }).filter(Objects::nonNull).collect(Collectors.toList());
+                }).filter(Objects::nonNull).toList();
 
-                jsonRpcSender.sendBulkResponses(responseList);
+                jsonRpcSender.sendBatchResponses(responseList);
             }
         }
     }
@@ -70,10 +69,17 @@ public class JsonRpcReader {
             final var result = requestHandler.apply(request.getMethod(), request.getParams());
             if (request.getId() != null) {
                 return JsonRpcResponse.forSuccess(result, request.getId());
+            } else {
+                logger.debug("Command '{}' succeeded but client didn't specify an id, dropping response",
+                        request.getMethod());
             }
         } catch (JsonRpcException e) {
             if (request.getId() != null) {
                 return JsonRpcResponse.forError(e.getError(), request.getId());
+            } else {
+                logger.debug("Command '{}' failed but client didn't specify an id, dropping error: {}",
+                        request.getMethod(),
+                        e.getMessage());
             }
         }
         return null;
@@ -84,10 +90,11 @@ public class JsonRpcReader {
             String input = lineSupplier.get();
 
             if (input == null) {
-                // Reached end of input stream
+                logger.trace("Reached end of JSON-RPC input stream.");
                 break;
             }
 
+            logger.trace("Incoming JSON-RPC message: {}", input);
             JsonRpcMessage message = parseJsonRpcMessage(input);
             if (message == null) continue;
 
@@ -122,8 +129,7 @@ public class JsonRpcReader {
                         null), null));
                 return null;
             }
-            return new JsonRpcBulkMessage(StreamSupport.stream(jsonNode.spliterator(), false)
-                    .collect(Collectors.toList()));
+            return new JsonRpcBatchMessage(StreamSupport.stream(jsonNode.spliterator(), false).toList());
         } else if (jsonNode.isObject()) {
             if (jsonNode.has("result") || jsonNode.has("error")) {
                 return parseJsonRpcResponse(jsonNode);
@@ -149,6 +155,10 @@ public class JsonRpcReader {
     }
 
     private JsonRpcRequest parseJsonRpcRequest(final JsonNode input) throws JsonRpcException {
+        if (input instanceof ObjectNode i && input.has("params") && input.get("params").isNull()) {
+            // Workaround for clients that send a null params field instead of omitting it
+            i.remove("params");
+        }
         JsonRpcRequest request;
         try {
             request = objectMapper.treeToValue(input, JsonRpcRequest.class);