jsonrpc2.0 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/jsonrpc2.0.gemspec +9 -0
- data/lib/jsonrpc2.0/Client.rb +42 -0
- data/lib/jsonrpc2.0/Constants.rb +3 -0
- data/lib/jsonrpc2.0/Errors.rb +40 -0
- data/lib/jsonrpc2.0/Server.rb +64 -0
- data/lib/jsonrpc2.0.rb +2 -0
- metadata +50 -0
data/jsonrpc2.0.gemspec
ADDED
@@ -0,0 +1,9 @@
|
|
1
|
+
Gem::Specification.new do |s|
|
2
|
+
s.name = 'jsonrpc2.0'
|
3
|
+
s.version = '0.1.0'
|
4
|
+
s.date = '2011-06-06'
|
5
|
+
s.summary = 'A server and client implementation of the JsonRpc 2.0 protocol.'
|
6
|
+
s.authors = ['Jannik Theiß']
|
7
|
+
s.files = ['jsonrpc2.0.gemspec', 'lib/jsonrpc2.0.rb', 'lib/jsonrpc2.0/Client.rb', 'lib/jsonrpc2.0/Constants.rb', 'lib/jsonrpc2.0/Errors.rb', 'lib/jsonrpc2.0/Server.rb']
|
8
|
+
s.required_ruby_version = '>= 1.9.2'
|
9
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'json'
|
2
|
+
require_relative './Constants.rb'
|
3
|
+
require_relative './Errors.rb'
|
4
|
+
|
5
|
+
class JsonRpcClient
|
6
|
+
include JsonRpcConstants
|
7
|
+
include JsonRpcErrors
|
8
|
+
|
9
|
+
def method_missing(inMethod, *inParams)
|
10
|
+
if (inMethod.to_s[(0..1)] == 'r_')
|
11
|
+
fire_request(inMethod.to_s[(2..-1)].to_sym, *inParams)
|
12
|
+
else
|
13
|
+
raise(NameError, inMethod.to_s, caller)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def fire_request(inMethod, *inParams)
|
18
|
+
request = create_message(inMethod, *inParams)
|
19
|
+
request['id'] = (0...10).map{ ('a'..'z').to_a[rand(26)] }.join
|
20
|
+
|
21
|
+
response = send_request request.to_json
|
22
|
+
response = JSON.parse response
|
23
|
+
|
24
|
+
raise error_from_hash(response['error']) if response.key?('error')
|
25
|
+
|
26
|
+
result = response['result']
|
27
|
+
result
|
28
|
+
end
|
29
|
+
|
30
|
+
def fire_notification(inMethod, *inParams)
|
31
|
+
send_notification create_message(inMethod, *inParams).to_json
|
32
|
+
nil
|
33
|
+
end
|
34
|
+
|
35
|
+
def create_message(inMethod, *inParams)
|
36
|
+
message = {}
|
37
|
+
message['jsonrpc'] = VERSION
|
38
|
+
message['method'] = inMethod
|
39
|
+
message['params'] = inParams if !inParams.empty?
|
40
|
+
message
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
3
|
+
module JsonRpcErrors
|
4
|
+
ERRORS = {'ParseError' => -32700, 'InvalidRequest' => -32600, 'MethodNotFound' => -32601, 'InvalidParams' => -32602, 'InternalError' => -32603}
|
5
|
+
|
6
|
+
class Error < StandardError
|
7
|
+
CODE = nil
|
8
|
+
|
9
|
+
attr_reader :data
|
10
|
+
|
11
|
+
def code
|
12
|
+
self.class::CODE
|
13
|
+
end
|
14
|
+
|
15
|
+
def initialize(message = "", data = nil)
|
16
|
+
super message
|
17
|
+
@data = data
|
18
|
+
end
|
19
|
+
|
20
|
+
def to_json(*a)
|
21
|
+
error = {}
|
22
|
+
error['code'] = code
|
23
|
+
error['message'] = message
|
24
|
+
error['data'] = data if !(data == nil)
|
25
|
+
error.to_json(*a)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def error_from_hash(inHash)
|
30
|
+
c = self.class.const_get ERRORS.key(inHash['code'])
|
31
|
+
c.new(inHash['message'], inHash['data'])
|
32
|
+
end
|
33
|
+
|
34
|
+
ERRORS.each do |className, errorCode|
|
35
|
+
c = Class::new(Error) do
|
36
|
+
const_set('CODE', errorCode)
|
37
|
+
end
|
38
|
+
const_set(className, c)
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'json'
|
2
|
+
require_relative './Constants.rb'
|
3
|
+
require_relative './Errors.rb'
|
4
|
+
|
5
|
+
class JsonRpcServer
|
6
|
+
include JsonRpcConstants
|
7
|
+
include JsonRpcErrors
|
8
|
+
|
9
|
+
def handle_message(inMessage)
|
10
|
+
begin
|
11
|
+
begin
|
12
|
+
message = JSON.parse inMessage
|
13
|
+
rescue JSON::ParserError => e
|
14
|
+
raise(ParseError, e.message)
|
15
|
+
end
|
16
|
+
|
17
|
+
if message.class == Array
|
18
|
+
response = message.map{ |e| handle_request(e) }.to_json
|
19
|
+
response.compact!
|
20
|
+
else
|
21
|
+
response = handle_request(message).to_json
|
22
|
+
end
|
23
|
+
rescue Error => e
|
24
|
+
id = nil
|
25
|
+
id = message['id'] if (message.class == Hash)
|
26
|
+
error = create_message(id)
|
27
|
+
error['error'] = e
|
28
|
+
response = error.to_json
|
29
|
+
ensure
|
30
|
+
response
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def handle_request(inRequest)
|
35
|
+
raise InvalidRequest if (inRequest.class != Hash)
|
36
|
+
raise InvalidRequest if (inRequest['jsonrpc'] != VERSION)
|
37
|
+
raise InvalidRequest if (!inRequest.key?('method'))
|
38
|
+
|
39
|
+
begin
|
40
|
+
method = method('r_' + inRequest['method'])
|
41
|
+
params = inRequest['params']
|
42
|
+
result = method.call(*params)
|
43
|
+
rescue NameError => e
|
44
|
+
raise(MethodNotFound, e.message)
|
45
|
+
rescue ArgumentError => e
|
46
|
+
raise(InvalidParams, e.message)
|
47
|
+
end
|
48
|
+
|
49
|
+
if inRequest.key?('id')
|
50
|
+
response = create_message(inRequest['id'])
|
51
|
+
response['result'] = result
|
52
|
+
response
|
53
|
+
else
|
54
|
+
nil
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def create_message(inId = nil)
|
59
|
+
message = {}
|
60
|
+
message['jsonrpc'] = VERSION
|
61
|
+
message['id'] = inId
|
62
|
+
message
|
63
|
+
end
|
64
|
+
end
|
data/lib/jsonrpc2.0.rb
ADDED
metadata
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: jsonrpc2.0
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Jannik Theiß
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2011-06-06 00:00:00.000000000Z
|
13
|
+
dependencies: []
|
14
|
+
description:
|
15
|
+
email:
|
16
|
+
executables: []
|
17
|
+
extensions: []
|
18
|
+
extra_rdoc_files: []
|
19
|
+
files:
|
20
|
+
- jsonrpc2.0.gemspec
|
21
|
+
- lib/jsonrpc2.0.rb
|
22
|
+
- lib/jsonrpc2.0/Client.rb
|
23
|
+
- lib/jsonrpc2.0/Constants.rb
|
24
|
+
- lib/jsonrpc2.0/Errors.rb
|
25
|
+
- lib/jsonrpc2.0/Server.rb
|
26
|
+
homepage:
|
27
|
+
licenses: []
|
28
|
+
post_install_message:
|
29
|
+
rdoc_options: []
|
30
|
+
require_paths:
|
31
|
+
- lib
|
32
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: 1.9.2
|
38
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ! '>='
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '0'
|
44
|
+
requirements: []
|
45
|
+
rubyforge_project:
|
46
|
+
rubygems_version: 1.8.5
|
47
|
+
signing_key:
|
48
|
+
specification_version: 3
|
49
|
+
summary: A server and client implementation of the JsonRpc 2.0 protocol.
|
50
|
+
test_files: []
|