json-rpc 0.1.5 → 0.1.6

Sign up to get free protection for your applications and to get access to all the features.
@@ -13,11 +13,13 @@ module JsonRpc
13
13
  request = Rpc::parse env
14
14
  status = Rpc::validate request
15
15
  result = Rpc::route request, self
16
-
17
- rescue Rpc::Error => e
16
+ rescue Exception, Rpc::Error => e
17
+ ecb.call(e) if ecb
18
+ unless e.is_a?(Rpc::Error)
19
+ e = Rpc::error :internal_error
20
+ end
18
21
  status = e.status
19
22
  result = e.result
20
- ecb.call(e) if ecb
21
23
  end
22
24
 
23
25
  header = {'Content-Type' => Rpc::ContentType}
@@ -0,0 +1,75 @@
1
+ require 'pp'
2
+ $: << File::join(File::dirname(__FILE__), "../../")
3
+ require 'lib/json-rpc'
4
+
5
+ class SimpleApp
6
+ include JsonRpc
7
+ alias :call :rpc_call
8
+
9
+ def rpc_sum a, b
10
+ a + b
11
+ end
12
+
13
+ def rpc_true
14
+ true
15
+ end
16
+
17
+ def rpc_false
18
+ false
19
+ end
20
+
21
+ def rpc_array
22
+ [1,2,3]
23
+ end
24
+
25
+ def rpc_empty_array
26
+ []
27
+ end
28
+
29
+ def rpc_hash
30
+ {
31
+ "a" => "Apple",
32
+ "b" => "Banana"
33
+ }
34
+ end
35
+
36
+ def rpc_repeat *params
37
+ params
38
+ end
39
+
40
+ end
41
+
42
+ class AsyncApp
43
+ include JsonRpc
44
+ alias :call :rpc_call
45
+
46
+ def initialize
47
+ @simple = SimpleApp.new
48
+ @simple.methods.find{ |name| name.to_s =~ /^rpc_/}.each do |name|
49
+ self.
50
+ end
51
+ end
52
+
53
+ def method_missing method, *args
54
+ result = Rpc::AsyncResult.new
55
+ EventMachine::next_tick do
56
+ e = catch(:Error) {
57
+ result.reply SimpleApp.new.send(method, *args)
58
+ result.succeed
59
+ nil
60
+ }
61
+ result.failed e[:code], e[:msg] if e
62
+ end
63
+ result
64
+ end
65
+
66
+ end
67
+
68
+ map '/rpc-sync' do
69
+ run SimpleApp.new
70
+ end
71
+
72
+ map '/rpc-async' do
73
+ run AsyncApp.new
74
+ end
75
+
@@ -44,68 +44,61 @@ class AsyncApp
44
44
  alias :call :rpc_call
45
45
 
46
46
  def rpc_sum a, b
47
- result = Rpc::AsyncResult.new
48
- EventMachine::next_tick do
49
- result.reply a + b
50
- result.succeed
47
+ wrap_async do
48
+ a + b
51
49
  end
52
- result
53
50
  end
54
51
 
55
52
  def rpc_true
56
- result = Rpc::AsyncResult.new
57
- EventMachine::next_tick do
58
- result.reply true
59
- result.succeed
53
+ wrap_async do
54
+ true
60
55
  end
61
- result
62
56
  end
63
57
 
64
58
  def rpc_false
65
- result = Rpc::AsyncResult.new
66
- EventMachine::next_tick do
67
- result.reply false
68
- result.succeed
59
+ wrap_async do
60
+ false
69
61
  end
70
- result
71
62
  end
72
63
 
73
64
  def rpc_array
74
- result = Rpc::AsyncResult.new
75
- EventMachine::next_tick do
76
- result.reply [1,2,3]
77
- result.succeed
65
+ wrap_async do
66
+ [1,2,3]
78
67
  end
79
- result
80
68
  end
81
69
 
82
70
  def rpc_empty_array
83
- result = Rpc::AsyncResult.new
84
- EventMachine::next_tick do
85
- result.reply []
86
- result.succeed
71
+ wrap_async do
72
+ []
87
73
  end
88
- result
89
74
  end
90
75
 
91
76
  def rpc_hash
92
- result = Rpc::AsyncResult.new
93
- EventMachine::next_tick do
94
- result.reply("a" => "Apple", "b" => "Banana")
95
- result.succeed
77
+ wrap_async do
78
+ {"a" => "Apple", "b" => "Banana"}
96
79
  end
97
- result
98
80
  end
99
81
 
100
82
  def rpc_repeat *params
83
+ wrap_async do
84
+ params
85
+ end
86
+ end
87
+
88
+ private
89
+
90
+ def wrap_async &block
101
91
  result = Rpc::AsyncResult.new
102
92
  EventMachine::next_tick do
103
- result.reply params
104
- result.succeed
93
+ e = catch(:Error) {
94
+ result.reply block.call result
95
+ result.succeed
96
+ nil
97
+ }
98
+ result.failed e[:code], e[:msg] if e
105
99
  end
106
100
  result
107
101
  end
108
-
109
102
  end
110
103
 
111
104
  map '/rpc-sync' do
@@ -1,22 +1,29 @@
1
1
  require 'test/unit'
2
- require 'net/http'
3
- require 'uri'
4
- require 'cgi'
2
+ require 'mechanize'
5
3
  require 'json'
6
4
  require 'pp'
7
-
5
+ require 'cgi'
8
6
 
9
7
  class RpcTest < Test::Unit::TestCase
10
8
 
9
+ attr_reader :session
10
+
11
11
  def initialize *args
12
12
  @rpc_path = self.is_a?(SyncTest) ? '/rpc-sync' : '/rpc-async'
13
- @rpc_url = URI.parse('http://localhost:4242')
13
+ @rpc_url = 'http://localhost:4242'
14
+ @get_off = @post_off = false
15
+ new_session
14
16
  super *args
15
17
  end
16
18
 
19
+ attr_accessor :post_off, :get_off
20
+
17
21
  def call method_rpc, *params, &blk
22
+ types = []
23
+ types.push :get unless @get_off
24
+ types.push :post unless @post_off
18
25
  if blk
19
- [:get, :post].each do |method_http|
26
+ types.each do |method_http|
20
27
  blk.call rpc_call(method_http, method_rpc, *params)
21
28
  end
22
29
  else
@@ -24,6 +31,13 @@ class RpcTest < Test::Unit::TestCase
24
31
  end
25
32
  end
26
33
 
34
+ def new_session session = nil
35
+ session = Mechanize.new unless session
36
+ priv_session = @session
37
+ @session = session
38
+ priv_session
39
+ end
40
+
27
41
  private
28
42
  def rpc_call method_http, method_rpc, *params
29
43
  rpc_request = {
@@ -32,18 +46,19 @@ class RpcTest < Test::Unit::TestCase
32
46
  :params => params,
33
47
  }
34
48
 
35
- res = Net::HTTP.start(@rpc_url.host, @rpc_url.port) do |http|
36
- case method_http
37
- when :get
38
- rpc_request[:params] = CGI::escape(rpc_request[:params].to_json)
39
- http.get @rpc_path + "?" + rpc_request.map{|a,b| "#{a}=#{b}"}.join("&")
40
- when :post
41
- req = Net::HTTP::Post.new(@rpc_path)
42
- req.body = rpc_request.to_json
43
- http.request(req)
44
- else
45
- raise "Unknown HTTP method #{method_http}"
46
- end
49
+ case method_http
50
+ when :get
51
+ #rpc_request[:params] = CGI::escape(rpc_request[:params].to_json)
52
+ #http.get @rpc_path + "?" + rpc_request.map{|a,b| "#{a}=#{b}"}.join("&")
53
+ rpc_request[:params] = rpc_request[:params].to_json
54
+ res = @session.get(@rpc_url + @rpc_path, rpc_request)
55
+ when :post
56
+ res = @session.post(@rpc_url + @rpc_path, rpc_request.to_json)
57
+ # req = Net::HTTP::Post.new(@rpc_path)
58
+ # req.body = rpc_request.to_json
59
+ # http.request(req)
60
+ else
61
+ raise "Unknown HTTP method #{method_http}"
47
62
  end
48
63
 
49
64
  JSON::parse(res.body)
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 1
8
- - 5
9
- version: 0.1.5
8
+ - 6
9
+ version: 0.1.6
10
10
  platform: ruby
11
11
  authors:
12
12
  - Helios Technologies Ltd.
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2011-06-28 00:00:00 +02:00
17
+ date: 2011-07-05 00:00:00 +03:00
18
18
  default_executable:
19
19
  dependencies: []
20
20
 
@@ -28,10 +28,11 @@ extra_rdoc_files: []
28
28
 
29
29
  files:
30
30
  - lib/json-rpc.rb
31
- - test/unit/test_rpc_module.rb
32
- - test/functional/test-mixed.rb
33
31
  - test/functional/app-mixed.ru
32
+ - test/functional/test-mixed.rb
33
+ - test/functional/#app-mixed.ru#
34
34
  - test/functional/rpc-test.rb
35
+ - test/unit/test_rpc_module.rb
35
36
  - example/async_app.ru
36
37
  - example/rack_app.ru
37
38
  - README.md