Module: JsonRpc::Rpc

Defined in:
lib/json-rpc.rb

Defined Under Namespace

Classes: AsyncResult, Error

Constant Summary collapse

Version =
"2.0".freeze
Prefix =
"rpc_".freeze
ContentType =
"application/json".freeze
ErrorProtocol =
{
  :parse_error      => [500, -32700, "Parse error"],
  :invalid_request  => [400, -32600, "Invalid Request"],
  :method_not_found => [404, -32601, "Method not found"],
  :invalid_params   => [500, -32602, "Invalid params"],
  :internal_error   => [500, -32603, "Internal error"],
}

Class Method Summary collapse

Class Method Details

.error(index, id = nil) ⇒ Object



54
55
56
57
58
59
# File 'lib/json-rpc.rb', line 54

def self.error index, id = nil
  id = nil unless id.is_a? Fixnum
  ex = Rpc::Error.new *ErrorProtocol[index]
  ex.id = id
  ex
end

.forge_response(result, id = nil) ⇒ Object



103
104
105
106
# File 'lib/json-rpc.rb', line 103

def self.forge_response result, id = nil
  return nil if id == nil
  {"jsonrpc" => "2.0", "id" => id, "result" => result}.to_json
end

.parse(env) ⇒ Object



68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
# File 'lib/json-rpc.rb', line 68

def self.parse env
  begin
    case env["REQUEST_METHOD"]
    when "POST"
      JSON.parse(env["rack.input"].read)
    when "GET"
      req = Rack::Request.new(env)
      obj = req.params
      obj["id"] = obj["id"] ? obj["id"].to_i : nil
      obj["params"] = JSON::parse(obj["params"])
      obj
    else
      raise error :invalid_request
    end

  rescue JSON::ParserError, Exception
    raise error :parse_error
  end
end

.route(request, ctrl) ⇒ Object



88
89
90
91
92
93
94
95
96
97
98
99
100
101
# File 'lib/json-rpc.rb', line 88

def self.route request, ctrl
  method, params = Prefix + request["method"], request["params"]

  unless ctrl.respond_to? method
    raise error :method_not_found, request["id"]
  end

  result = ctrl.send(method, *params)
  if result.is_a? AsyncResult
    result.id = request["id"]
    return result
  end
  forge_response result, request["id"]
end

.validate(request) ⇒ Object



61
62
63
64
65
66
# File 'lib/json-rpc.rb', line 61

def self.validate request
  return 200 if request["jsonrpc"] == Version and
    request["method"].kind_of?(String) and
    request["method"] != ""
  raise error :invalid_request, request["id"]
end