json-rpc 0.1.2 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. data/README.md +2 -3
  2. data/lib/json-rpc.rb +42 -7
  3. metadata +3 -3
data/README.md CHANGED
@@ -38,8 +38,6 @@ class AsyncApp
38
38
  AsyncResponse = [-1, {}, []].freeze
39
39
  def call env
40
40
  result = rpc_call(env)
41
- env['async.callback'].call result
42
- AsyncResponse
43
41
  end
44
42
 
45
43
  def rpc_sum a, b
@@ -56,7 +54,8 @@ end
56
54
  Test it works:
57
55
 
58
56
  ~~~~~~ {sh}
59
- $ curl "http://localhost:3000/rpc?jsonrpc=2.0&method=sum&params=%5B21%2C21%5D"
57
+ $ thin -R example.ru -p 4242 -d start
58
+ $ curl "http://localhost:4242/rpc?jsonrpc=2.0&method=sum&params=%5B21%2C21%5D"
60
59
  {"jsonrpc":"2.0","id":0,"result":42}
61
60
  ~~~~~~
62
61
 
@@ -20,7 +20,15 @@ module JsonRpc
20
20
  ecb.call(e) if ecb
21
21
  end
22
22
 
23
- [status, {'Content-Type' => Rpc::ContentType}, result]
23
+ header = {'Content-Type' => Rpc::ContentType}
24
+
25
+ if result.is_a?(Rpc::AsyncResult)
26
+ result.status = status
27
+ result.header = header
28
+ return [-1, {}, result]
29
+ end
30
+
31
+ [status, header, result]
24
32
  end
25
33
 
26
34
  module Rpc
@@ -43,10 +51,15 @@ module JsonRpc
43
51
  @status, @code, @msg, @msg_debug = status, code, msg, msg_debug
44
52
  end
45
53
  def result
46
- res = {"jsonrpc" => "2.0", "id" => id,
47
- "error" => {"code" => code, "message" => msg}
54
+ res = {
55
+ "id" => id,
56
+ "jsonrpc" => "2.0",
57
+ "error" => {
58
+ "code" => code,
59
+ "message" => msg
60
+ }
48
61
  }
49
- res.delete_if { |k, v| v == nil}
62
+ res.delete_if { |k, v| v == nil }
50
63
  res.to_json
51
64
  end
52
65
  def to_s
@@ -73,14 +86,14 @@ module JsonRpc
73
86
  case env["REQUEST_METHOD"]
74
87
  when "POST"
75
88
  JSON.parse(env["rack.input"].read)
76
- when "GET"
89
+ when /^(GET|HEAD)$/
77
90
  req = Rack::Request.new(env)
78
91
  obj = req.params
79
92
  obj["id"] = obj["id"].to_i
80
93
  obj["params"] = obj["params"] ? JSON::parse(obj["params"]) : []
81
94
  obj
82
95
  else
83
- raise error :invalid_request, nil, "invalid params: #{obj.inspect}"
96
+ raise error :invalid_request, nil, "unsupported method #{env["REQUEST_METHOD"]} params: #{obj.inspect}"
84
97
  end
85
98
 
86
99
  rescue JSON::ParserError => e
@@ -114,12 +127,34 @@ module JsonRpc
114
127
  include EventMachine::Deferrable
115
128
 
116
129
  attr_reader :response
117
- attr_accessor :id
130
+ attr_accessor :id, :status, :header
131
+
132
+ def initialize env = nil
133
+ @env = env
134
+ @status = 200
135
+ @header = {}
136
+ @header_sent = false
137
+ end
138
+
139
+ def send_header
140
+ raise "You should pass env to AsyncResult.new()" unless @env
141
+ @env['async.callback'].call([@status, @header, self]) unless @header_sent
142
+ @header_sent = true
143
+ end
118
144
 
119
145
  def reply obj
146
+ send_header unless @callback
120
147
  @callback.call(Rpc::forge_response(obj, @id))
121
148
  end
122
149
 
150
+ def failed error_code = :internal_error, msg = nil
151
+ e = Rpc::error(error_code, id, msg)
152
+ @status = e.status
153
+ send_header
154
+ @callback.call(e.result)
155
+ succeed
156
+ end
157
+
123
158
  #FIXME thin specific
124
159
  def each &blk
125
160
  @callback = blk
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 1
8
- - 2
9
- version: 0.1.2
8
+ - 4
9
+ version: 0.1.4
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-20 00:00:00 +02:00
17
+ date: 2011-06-27 00:00:00 +02:00
18
18
  default_executable:
19
19
  dependencies: []
20
20