Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 19 additions & 5 deletions lib/json_rpc_handler.rb
Original file line number Diff line number Diff line change
Expand Up @@ -103,12 +103,26 @@ def process_request(request, &method_finder)

success_response id:, result:
rescue StandardError => e
error_response id:, error: {
code: ErrorCode::InternalError,
message: 'Internal error',
data: e.message,
}
handle_error e, id
end
end

def handle_error(error, id)
raw_code = error.respond_to?(:code) ? error.code : nil

code, message = case raw_code
when ErrorCode::InvalidRequest then [ErrorCode::InvalidRequest, 'Invalid Request']
when ErrorCode::InvalidParams then [ErrorCode::InvalidParams, 'Invalid params']
when ErrorCode::ParseError then [ErrorCode::ParseError, 'Parse error']
when ErrorCode::InternalError then [ErrorCode::InternalError, 'Internal error']
else [ErrorCode::InternalError, 'Internal error']
end

error_response id:, error: {
code:,
message:,
data: error.message,
}
end

def valid_version?(version)
Expand Down
97 changes: 96 additions & 1 deletion test/json_rpc_handler_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,15 @@

require 'test_helper'

class RequestHandlerError < StandardError
attr_reader :code

def initialize(message, request = {}, code: nil, **_options)
super(message)
@code = code
end
end

describe JsonRpcHandler do
before do
@registry = {}
Expand Down Expand Up @@ -454,7 +463,93 @@
it "returns an error with the id set to nil when the request is invalid" do
handle_json({ jsonrpc: "0.0", id: 1, method: "add", params: { a: 1, b: 2 } }.to_json)

assert_nil @response[:id]
assert_nil @response[:id]
end

describe 'handle_error' do
it "returns an error object as a Invalid request error when an exception with `-32602` code is raised" do
register "logging/setLevel" do |params|
raise RequestHandlerError.new("Invalid log level", {}, code: -32602)
end

handle_json({ jsonrpc: "2.0", id: 1, method: "logging/setLevel", params: { level: "info" } }.to_json)

assert_rpc_error expected_error: {
code: -32602,
message: 'Invalid params',
data: 'Invalid log level',
}
end

it "returns an error object as a Invalid request error when an exception with `-32600` code is raised" do
register "logging/setLevel" do |params|
raise RequestHandlerError.new("Invalid log level", {}, code: -32600)
end

handle_json({ jsonrpc: "2.0", id: 1, method: "logging/setLevel", params: { level: "info" } }.to_json)

assert_rpc_error expected_error: {
code: -32600,
message: 'Invalid Request',
data: 'Invalid log level',
}
end

it "returns an error object as a Parse error when an exception with `-32700` code is raised" do
register "logging/setLevel" do |params|
raise RequestHandlerError.new("Invalid log level", {}, code: -32700)
end

handle_json({ jsonrpc: "2.0", id: 1, method: "logging/setLevel", params: { level: "info" } }.to_json)

assert_rpc_error expected_error: {
code: -32700,
message: 'Parse error',
data: 'Invalid log level',
}
end

it "returns an error object as a Internal error when an exception with undefined code is raised" do
register "logging/setLevel" do |params|
raise RequestHandlerError.new("Invalid log level", {}, code: -99999)
end

handle_json({ jsonrpc: "2.0", id: 1, method: "logging/setLevel", params: { level: "info" } }.to_json)

assert_rpc_error expected_error: {
code: -32603,
message: 'Internal error',
data: 'Invalid log level',
}
end

it "returns an error object as a Internal error when an exception with nil code is raised" do
register "logging/setLevel" do |params|
raise RequestHandlerError.new("Invalid log level", {}, code: nil)
end

handle_json({ jsonrpc: "2.0", id: 1, method: "logging/setLevel", params: { level: "info" } }.to_json)

assert_rpc_error expected_error: {
code: -32603,
message: 'Internal error',
data: 'Invalid log level',
}
end

it "returns an error object as a internal error when an exception without code is raised" do
register "logging/setLevel" do |params|
raise RequestHandlerError.new("Invalid log level", {}, error_type: :invalid_log_level)
end

handle_json({ jsonrpc: "2.0", id: 1, method: "logging/setLevel", params: { level: "info" } }.to_json)

assert_rpc_error expected_error: {
code: -32603,
message: 'Internal error',
data: 'Invalid log level',
}
end
end
end

Expand Down
Loading