Hi, while testing some functionnalities, I met an error that was not handled by dispatch_msg.
Indeed, if there is a test inside the constructor of some parameter of the call, like an @assert this errors, and breaks the JSONRPC communication because it does not return a JSONRPCError that could be properly handler later on.
The implementation below catches any error occurring during that step.
Do you think this could be a relevant addition ?
function JSONRPC.dispatch_msg(x::JSONRPCEndpoint, dispatcher::MsgDispatcher, msg::Request)
dispatcher._currentlyHandlingMsg = true
try
method_name = msg.method
handler = get(dispatcher._handlers, method_name, nothing)
if handler !== nothing
param_type = get_param_type(handler.message_type)
params = try
param_type === Nothing ? nothing : param_type <: NamedTuple ? convert(param_type, (; (Symbol(i[1]) => i[2] for i in msg.params)...)) : param_type(msg.params)
catch ex
# Return an error if the conversion to the requested type fails for some reason
JSONRPCError(-999999, "Conversion error", nothing)
end
if handler.message_type isa RequestType
handler.func(x, params, msg.token)
else
handler.func(x, params)
end
if handler.message_type isa RequestType
if res isa JSONRPCError
send_error_response(x, msg, res.code, res.msg, res.data)
elseif res isa get_return_type(handler.message_type)
send_success_response(x, msg, res)
else
error_msg = "The handler for the '$method_name' request returned a value of type $(typeof(res)), which is not a valid return type according to the request definition."
send_error_response(x, msg, -32603, error_msg, nothing)
error(error_msg)
end
end
else
error("Unknown method $method_name.")
end
finally
dispatcher._currentlyHandlingMsg = false
end
end
Hi, while testing some functionnalities, I met an error that was not handled by
dispatch_msg.Indeed, if there is a test inside the constructor of some parameter of the call, like an
@assertthis errors, and breaks the JSONRPC communication because it does not return aJSONRPCErrorthat could be properly handler later on.The implementation below catches any error occurring during that step.
Do you think this could be a relevant addition ?