Add workaround for jsonrpc clients that send null params

This commit is contained in:
AsamK 2021-12-22 19:18:42 +01:00
parent 9a72733c4f
commit f9ecaa8ad6
2 changed files with 10 additions and 5 deletions

View file

@ -5,6 +5,7 @@ import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ContainerNode; import com.fasterxml.jackson.databind.node.ContainerNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.fasterxml.jackson.databind.node.ValueNode; import com.fasterxml.jackson.databind.node.ValueNode;
import org.asamk.signal.util.Util; import org.asamk.signal.util.Util;
@ -39,7 +40,7 @@ public class JsonRpcReader {
if (message == null) break; if (message == null) break;
if (message instanceof final JsonRpcRequest jsonRpcRequest) { if (message instanceof final JsonRpcRequest jsonRpcRequest) {
logger.debug("Received json rpc request, method: " + jsonRpcRequest.method); logger.debug("Received json rpc request, method: " + jsonRpcRequest.getMethod());
final var response = handleRequest(requestHandler, jsonRpcRequest); final var response = handleRequest(requestHandler, jsonRpcRequest);
if (response != null) { if (response != null) {
jsonRpcSender.sendResponse(response); jsonRpcSender.sendResponse(response);
@ -153,6 +154,10 @@ public class JsonRpcReader {
} }
private JsonRpcRequest parseJsonRpcRequest(final JsonNode input) throws JsonRpcException { 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; JsonRpcRequest request;
try { try {
request = objectMapper.treeToValue(input, JsonRpcRequest.class); request = objectMapper.treeToValue(input, JsonRpcRequest.class);

View file

@ -13,21 +13,21 @@ public final class JsonRpcRequest extends JsonRpcMessage {
/** /**
* A String specifying the version of the JSON-RPC protocol. MUST be exactly "2.0". * A String specifying the version of the JSON-RPC protocol. MUST be exactly "2.0".
*/ */
String jsonrpc; private String jsonrpc;
/** /**
* A String containing the name of the method to be invoked. * A String containing the name of the method to be invoked.
* Method names that begin with the word rpc followed by a period character (U+002E or ASCII 46) * Method names that begin with the word rpc followed by a period character (U+002E or ASCII 46)
* are reserved for rpc-internal methods and extensions and MUST NOT be used for anything else. * are reserved for rpc-internal methods and extensions and MUST NOT be used for anything else.
*/ */
String method; private String method;
/** /**
* A Structured value that holds the parameter values to be used during the invocation of the method. * A Structured value that holds the parameter values to be used during the invocation of the method.
* This member MAY be omitted. * This member MAY be omitted.
*/ */
@JsonInclude(JsonInclude.Include.NON_NULL) @JsonInclude(JsonInclude.Include.NON_NULL)
ContainerNode<?> params; private ContainerNode<?> params;
/** /**
* An identifier established by the Client that MUST contain a String, Number, or NULL value if included. * An identifier established by the Client that MUST contain a String, Number, or NULL value if included.
@ -35,7 +35,7 @@ public final class JsonRpcRequest extends JsonRpcMessage {
* The value SHOULD normally not be Null and Numbers SHOULD NOT contain fractional parts * The value SHOULD normally not be Null and Numbers SHOULD NOT contain fractional parts
*/ */
@JsonInclude(JsonInclude.Include.NON_NULL) @JsonInclude(JsonInclude.Include.NON_NULL)
ValueNode id; private ValueNode id;
public static JsonRpcRequest forNotification( public static JsonRpcRequest forNotification(
final String method, final ContainerNode<?> params, final ValueNode id final String method, final ContainerNode<?> params, final ValueNode id