X-Git-Url: https://git.nmode.ca/signal-cli/blobdiff_plain/19f7b5d78d29544829b25f1cea1ebc24c151f1c3..ae678871ec976f2bcf1cee969e555ca00239f7d8:/src/main/java/org/asamk/signal/jsonrpc/JsonRpcReader.java diff --git a/src/main/java/org/asamk/signal/jsonrpc/JsonRpcReader.java b/src/main/java/org/asamk/signal/jsonrpc/JsonRpcReader.java index 0a7017be..f3784a2c 100644 --- a/src/main/java/org/asamk/signal/jsonrpc/JsonRpcReader.java +++ b/src/main/java/org/asamk/signal/jsonrpc/JsonRpcReader.java @@ -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 responseHandler - ) { + public void readMessages(final RequestHandler requestHandler, final Consumer 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); } } } @@ -91,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; @@ -129,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); @@ -156,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);