ione-rpc 1.0.1 → 1.1.0.pre0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: bd2dfbaf504cd8f90db14054c3f1be44a1bf6740
4
- data.tar.gz: 4ecca4c71c9d9857c4df03a0caaecf52fb56a973
3
+ metadata.gz: b76720f1019ef558e761ca6150d3e6417525f7e4
4
+ data.tar.gz: e0e60b176ac1d29de164124a9db8090be4224e2c
5
5
  SHA512:
6
- metadata.gz: 005b40b386819c5f9ce87398b6456981b996d7d9a82f03aa13db17f64a18db4de9117474261b7a1c7a2cf30117542db425c00165d8a5f99272441f5413ce5c5a
7
- data.tar.gz: 336273d46b03c7cbcd15f59b2c9f3b46ce8da3de9169b583bbb9f867238af9eff73f4dc9cca227f93aa38409ed5342e1c2dd7a413cc05f37937fa712770b6cc8
6
+ metadata.gz: 843c6352df3a73996b9df2c110e4c9c259f85fa6dec03cda53619f69af220ba519aa17a11ef583aa111523a6dbe3e8fa09bfd987144dc7e3ee4b3809777b5afa
7
+ data.tar.gz: 1ecb1ef66d1f4f17ca14dccc216cc21a9ecaec02eee64fe1bed4bf32229f44dd56616df562fc0af64fdd09ab79314b6a651cc5a8d1d21f431e5ac12b406c6dd6
@@ -52,7 +52,9 @@ module Ione
52
52
 
53
53
  # Override this method to handle errors raised or returned by
54
54
  # {#handle_request} or any other part of the request handling (for example
55
- # the response encoding).
55
+ # the response encoding). In the event that {#handle_request} completed
56
+ # successfully, the response will contain that result, otherwise it will
57
+ # be nil.
56
58
  #
57
59
  # When this method raises an error or returns a failed future there will be
58
60
  # no response for the request. Unless you use a custom client this means
@@ -65,9 +67,12 @@ module Ione
65
67
  # with the error message and class. The full backtrace will also be logged
66
68
  # at the `debug` level.
67
69
  #
70
+ # To remain backwards compatible, the method can be overridden to take only
71
+ # three arguments, in which case the response is omitted.
72
+ #
68
73
  # @return [Ione::Future<Object>] a future that will resolve to an alternate
69
74
  # response for this request.
70
- def handle_error(error, request, connection)
75
+ def handle_error(error, request, response=nil, connection)
71
76
  Ione::Future.failed(error)
72
77
  end
73
78
 
@@ -90,8 +95,12 @@ module Ione
90
95
  end
91
96
 
92
97
  # @private
93
- def guarded_handle_error(error, request, connection)
94
- handle_error(error, request, connection)
98
+ def guarded_handle_error(error, request, response, connection)
99
+ if method(:handle_error).arity == 3
100
+ handle_error(error, request, connection)
101
+ else
102
+ handle_error(error, request, response, connection)
103
+ end
95
104
  rescue => e
96
105
  Ione::Future.failed(e)
97
106
  end
@@ -112,8 +121,14 @@ module Ione
112
121
  @acceptor.on_accept do |connection|
113
122
  @logger.info('Connection from %s:%d accepted' % [connection.host, connection.port]) if @logger
114
123
  peer = ServerPeer.new(connection, @codec, self, @logger)
115
- peer.on_closed do
116
- @logger.info('Connection from %s:%d closed' % [connection.host, connection.port]) if @logger
124
+ if @logger
125
+ peer.on_closed do |error|
126
+ if error
127
+ @logger.warn(sprintf('Connection from %s:%d closed unexpectedly: %s (%s)', connection.host, connection.port, error.message, error.class.name))
128
+ else
129
+ @logger.info(sprintf('Connection from %s:%d closed', connection.host, connection.port))
130
+ end
131
+ end
117
132
  end
118
133
  handle_connection(peer)
119
134
  end
@@ -134,17 +149,19 @@ module Ione
134
149
  end
135
150
 
136
151
  def send_response(f, message, channel, try_again)
137
- f = f.map do |response|
152
+ response = nil
153
+ f = f.map do |r|
154
+ response = r
138
155
  encoded_response = @codec.encode(response, channel)
139
156
  @connection.write(encoded_response)
140
157
  nil
141
158
  end
142
- f.fallback do |error|
159
+ f.on_failure do |error|
143
160
  if try_again
144
- ff = @server.guarded_handle_error(error, message, self)
161
+ ff = @server.guarded_handle_error(error, message, response, self)
145
162
  send_response(ff, message, channel, false)
146
- else
147
- @logger.error('Unhandled error: %s (%s)' % [error.message, error.class.name])
163
+ elsif @logger
164
+ @logger.error(sprintf('Unhandled error for %s:%d; %s (%s)', @connection.host, @connection.port, error.message, error.class.name))
148
165
  error.backtrace && @logger.debug(error.backtrace.join("#{$/}\t"))
149
166
  end
150
167
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Ione
4
4
  module Rpc
5
- VERSION = '1.0.1'.freeze
5
+ VERSION = '1.1.0.pre0'.freeze
6
6
  end
7
7
  end
@@ -141,6 +141,11 @@ module Ione
141
141
  raw_connection.closed_listener.call
142
142
  logger.should have_received(:info).with('Connection from client.example.com:34534 closed')
143
143
  end
144
+
145
+ it 'logs when the client is disconnected unexpectedly' do
146
+ raw_connection.closed_listener.call(IOError.new('Boork'))
147
+ logger.should have_received(:warn).with('Connection from client.example.com:34534 closed unexpectedly: Boork (IOError)')
148
+ end
144
149
  end
145
150
 
146
151
  context 'when a client sends a request' do
@@ -197,16 +202,17 @@ module Ione
197
202
  server.errors.should == [StandardError.new('Borkzor')]
198
203
  end
199
204
 
200
- it 'calls #handle_error with the error, the request and the connection' do
201
- error, request, connection = nil, nil, nil
205
+ it 'calls #handle_error with the error, the request, no response, and the connection' do
206
+ error, request, response, connection = nil, nil, nil, nil
202
207
  server.override_handle_request { Ione::Future.failed(StandardError.new('Borkzor')) }
203
- server.override_handle_error { |e, r, c| error = e; request = r; connection = c }
208
+ server.override_handle_error { |e, q, r, c| error = e; request = q; response = r; connection = c }
204
209
  peer = server.connections.first
205
210
  peer.handle_message('FOOBAZ', 42)
206
211
  error.should be_a(StandardError)
207
- error.message.should == 'Borkzor'
208
- request.should == 'FOOBAZ'
209
- connection.should == peer
212
+ error.message.should eq('Borkzor')
213
+ request.should eq('FOOBAZ')
214
+ response.should be_nil
215
+ connection.should equal(peer)
210
216
  end
211
217
 
212
218
  it 'responds with the message returned by #handle_error' do
@@ -244,7 +250,7 @@ module Ione
244
250
  server.override_handle_request { raise StandardError, 'Borkzor' }
245
251
  peer = server.connections.first
246
252
  peer.handle_message('FOOBAZ', 42)
247
- logger.should have_received(:error).with(/^Unhandled error: Borkzor \(StandardError\)/i)
253
+ logger.should have_received(:error).with(/^Unhandled error for client.example.com:34534; Borkzor \(StandardError\)/i)
248
254
  logger.should have_received(:debug).with(/\d+:in/)
249
255
  end
250
256
 
@@ -253,7 +259,7 @@ module Ione
253
259
  server.override_handle_error { |e| raise StandardError, "OH NOES: #{e.message}" }
254
260
  peer = server.connections.first
255
261
  peer.handle_message('FOOBAZ', 42)
256
- logger.should have_received(:error).with(/^Unhandled error: OH NOES: Borkzor \(StandardError\)/i)
262
+ logger.should have_received(:error).with(/^Unhandled error for client.example.com:34534; OH NOES: Borkzor \(StandardError\)/i)
257
263
  end
258
264
 
259
265
  it 'logs when #handle_error returns a failed future' do
@@ -261,7 +267,7 @@ module Ione
261
267
  server.override_handle_error { |e| Ione::Future.failed(StandardError.new("OH NOES: #{e.message}")) }
262
268
  peer = server.connections.first
263
269
  peer.handle_message('FOOBAZ', 42)
264
- logger.should have_received(:error).with(/^Unhandled error: OH NOES: Borkzor \(StandardError\)/i)
270
+ logger.should have_received(:error).with(/^Unhandled error for client.example.com:34534; OH NOES: Borkzor \(StandardError\)/i)
265
271
  end
266
272
 
267
273
  context 'when the codec fails to encode the response' do
@@ -274,6 +280,20 @@ module Ione
274
280
  server.errors.first.message.should == 'Borkzor'
275
281
  end
276
282
 
283
+ it 'calls #handle_error with the error, the request, the response, and the connection' do
284
+ error, request, response, connection = nil, nil, nil, nil
285
+ server.override_handle_request { Ione::Future.resolved('OK') }
286
+ server.override_handle_error { |e, q, r, c| error = e; request = q; response = r; connection = c }
287
+ codec.stub(:encode).with('OK', 42).and_raise(CodecError.new('Borkzor'))
288
+ peer = server.connections.first
289
+ peer.handle_message('FOOBAZ', 42)
290
+ error.should be_a(CodecError)
291
+ error.message.should eq('Borkzor')
292
+ request.should eq('FOOBAZ')
293
+ response.should eq('OK')
294
+ connection.should equal(peer)
295
+ end
296
+
277
297
  it 'responds with what #handle_error responds with' do
278
298
  server.override_handle_request { Ione::Future.resolved('OK') }
279
299
  server.override_handle_error { |e| Ione::Future.resolved("ERROR: #{e.message}") }
@@ -301,7 +321,26 @@ module Ione
301
321
  codec.stub(:encode).with('ERROR: Borkzor', 42).and_raise(CodecError.new('Buzzfuzz'))
302
322
  peer = server.connections.first
303
323
  peer.handle_message('FOOBAZ', 42)
304
- logger.should have_received(:error).with(/^Unhandled error: Buzzfuzz \(Ione::Rpc::CodecError\)/i)
324
+ logger.should have_received(:error).with(/^Unhandled error for client.example.com:34534; Buzzfuzz \(Ione::Rpc::CodecError\)/i)
325
+ end
326
+ end
327
+
328
+ context 'with a legacy server subclass' do
329
+ let :server do
330
+ ServerSpec::LegacyTestServer.new(4321, codec, io_reactor: io_reactor, logger: logger)
331
+ end
332
+
333
+ it 'calls #handle_error with the error, the request and the connection for legacy servers' do
334
+ error, request, response, connection = nil, nil, nil, nil
335
+ server.override_handle_request { Ione::Future.failed(StandardError.new('Borkzor')) }
336
+ server.override_handle_error { |e, q, r, c| error = e; request = q; response = r; connection = c }
337
+ peer = server.connections.first
338
+ peer.handle_message('FOOBAZ', 42)
339
+ error.should be_a(StandardError)
340
+ error.message.should eq('Borkzor')
341
+ request.should eq('FOOBAZ')
342
+ response.should eq(:legacy)
343
+ connection.should equal(peer)
305
344
  end
306
345
  end
307
346
  end
@@ -333,10 +372,10 @@ module ServerSpec
333
372
  @request_handler = handler
334
373
  end
335
374
 
336
- def handle_error(error, request, connection)
375
+ def handle_error(error, request, response, connection)
337
376
  @errors << error
338
377
  if @error_handler
339
- @error_handler.call(error, request, connection)
378
+ @error_handler.call(error, request, response, connection)
340
379
  else
341
380
  super
342
381
  end
@@ -351,4 +390,10 @@ module ServerSpec
351
390
  end
352
391
  end
353
392
  end
393
+
394
+ class LegacyTestServer < TestServer
395
+ def handle_error(error, request, connection)
396
+ super(error, request, :legacy, connection)
397
+ end
398
+ end
354
399
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ione-rpc
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.1.0.pre0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Theo Hultberg
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-01-21 00:00:00.000000000 Z
11
+ date: 2015-11-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ione
@@ -67,9 +67,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
67
67
  version: 1.9.3
68
68
  required_rubygems_version: !ruby/object:Gem::Requirement
69
69
  requirements:
70
- - - '>='
70
+ - - '>'
71
71
  - !ruby/object:Gem::Version
72
- version: '0'
72
+ version: 1.3.1
73
73
  requirements: []
74
74
  rubyforge_project:
75
75
  rubygems_version: 2.2.1