raktr 0.0.1 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +9 -0
- data/README.md +0 -29
- data/lib/raktr/connection/tls.rb +19 -25
- data/lib/raktr/connection.rb +17 -23
- data/lib/raktr/version.rb +1 -1
- data/lib/raktr.rb +15 -19
- data/spec/raktr/connection/tls_spec.rb +10 -10
- data/spec/spec_helper.rb +1 -0
- data/spec/support/lib/servers.rb +1 -0
- data/spec/support/shared/raktr.rb +11 -11
- metadata +24 -25
- data/lib/raktr/connection/error.rb +0 -120
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 78b82e1e277f9547fdfc576009b4b5883df5711ba8cca50a369651f758407aff
|
4
|
+
data.tar.gz: 1f594aa25c1872d359de5f7ef1a5e42dcad7699ff5ab54594ab099a3d2fa4315
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b0f1c2ec3508f4fa3c7bc841c553e5cc220208a3f7ea922802681742d33fbcb930a329eec352198f42f7910e90b679e663d08a1be19e5a91afdeb75b7cca57ed
|
7
|
+
data.tar.gz: 70eea04282a7c7ddf99d7f3df0e1e170e4eafaecb165ae02355aa1af899df089577aee4473b36a02358dd90008d2dded1772d3f7853d50dfc8ab62c7cc74a025
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -1,34 +1,5 @@
|
|
1
1
|
# Raktr
|
2
2
|
|
3
|
-
<table>
|
4
|
-
<tr>
|
5
|
-
<th>Version</th>
|
6
|
-
<td>0.0.1</td>
|
7
|
-
</tr>
|
8
|
-
<tr>
|
9
|
-
<th>Github page</th>
|
10
|
-
<td><a href="http://github.com/qadron/raktr">http://github.com/qadron/raktr</a></td>
|
11
|
-
<tr/>
|
12
|
-
<tr>
|
13
|
-
<th>Code Documentation</th>
|
14
|
-
<td><a href="http://rubydoc.info/github/qadron/raktr/">http://rubydoc.info/github/qadron/raktr/</a></td>
|
15
|
-
</tr>
|
16
|
-
<tr>
|
17
|
-
<th>Author</th>
|
18
|
-
<td><a href="http://twitter.com/Zap0tek">Tasos Laskos</a></td>
|
19
|
-
</tr>
|
20
|
-
<tr>
|
21
|
-
<th>Copyright</th>
|
22
|
-
<td>2022 <a href="https://ecsypno.com">Ecsypno</a></td>
|
23
|
-
</tr>
|
24
|
-
<tr>
|
25
|
-
<th>License</th>
|
26
|
-
<td><a href="file.LICENSE.html">3-clause BSD</a></td>
|
27
|
-
</tr>
|
28
|
-
</table>
|
29
|
-
|
30
|
-
## Synopsis
|
31
|
-
|
32
3
|
Raktr is a simple, lightweight, pure-Ruby implementation of the
|
33
4
|
[Reactor](http://en.wikipedia.org/wiki/Reactor_pattern) pattern, mainly focused
|
34
5
|
on network connections -- and less so on generic tasks.
|
data/lib/raktr/connection/tls.rb
CHANGED
@@ -77,18 +77,16 @@ module TLS
|
|
77
77
|
def _connect
|
78
78
|
return if @ssl_connected
|
79
79
|
|
80
|
-
|
81
|
-
|
82
|
-
return if !@plaintext_connected
|
80
|
+
@plaintext_connected ||= super
|
81
|
+
return if !@plaintext_connected
|
83
82
|
|
84
|
-
|
85
|
-
|
83
|
+
# Mark the connection as not connected due to the pending SSL handshake.
|
84
|
+
@connected = false
|
86
85
|
|
87
|
-
|
88
|
-
|
89
|
-
end
|
86
|
+
@socket.connect_nonblock
|
87
|
+
@ssl_connected = @connected = true
|
90
88
|
rescue IO::WaitReadable, IO::WaitWritable, Errno::EINPROGRESS
|
91
|
-
rescue
|
89
|
+
rescue => e
|
92
90
|
close e
|
93
91
|
end
|
94
92
|
|
@@ -118,11 +116,9 @@ module TLS
|
|
118
116
|
private
|
119
117
|
|
120
118
|
def ssl_accept
|
121
|
-
|
122
|
-
@accepted = !!@socket.accept_nonblock
|
123
|
-
end
|
119
|
+
@accepted = !!@socket.accept_nonblock
|
124
120
|
rescue IO::WaitReadable, IO::WaitWritable
|
125
|
-
rescue
|
121
|
+
rescue => e
|
126
122
|
close e
|
127
123
|
false
|
128
124
|
end
|
@@ -142,19 +138,17 @@ module TLS
|
|
142
138
|
#
|
143
139
|
# @private
|
144
140
|
def socket_accept
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
ssl_socket
|
155
|
-
end
|
141
|
+
socket = to_io.accept_nonblock
|
142
|
+
|
143
|
+
ssl_socket = OpenSSL::SSL::SSLSocket.new(
|
144
|
+
socket,
|
145
|
+
@ssl_context
|
146
|
+
)
|
147
|
+
ssl_socket.sync_close = true
|
148
|
+
ssl.accept if @start_immediately
|
149
|
+
ssl_socket
|
156
150
|
rescue IO::WaitReadable, IO::WaitWritable
|
157
|
-
rescue
|
151
|
+
rescue => e
|
158
152
|
close e
|
159
153
|
end
|
160
154
|
|
data/lib/raktr/connection.rb
CHANGED
@@ -6,7 +6,6 @@
|
|
6
6
|
|
7
7
|
=end
|
8
8
|
|
9
|
-
require_relative 'connection/error'
|
10
9
|
require_relative 'connection/callbacks'
|
11
10
|
require_relative 'connection/peer_info'
|
12
11
|
require_relative 'connection/tls'
|
@@ -229,9 +228,7 @@ class Connection
|
|
229
228
|
return true if unix? || connected?
|
230
229
|
|
231
230
|
begin
|
232
|
-
|
233
|
-
socket.connect_nonblock( Socket.sockaddr_in( @port, @host ) )
|
234
|
-
end
|
231
|
+
socket.connect_nonblock( Socket.sockaddr_in( @port, @host ) )
|
235
232
|
# Already connected. :)
|
236
233
|
rescue Errno::EISCONN, Errno::EALREADY
|
237
234
|
end
|
@@ -241,7 +238,7 @@ class Connection
|
|
241
238
|
|
242
239
|
true
|
243
240
|
rescue IO::WaitReadable, IO::WaitWritable, Errno::EINPROGRESS
|
244
|
-
rescue
|
241
|
+
rescue => e
|
245
242
|
close e
|
246
243
|
end
|
247
244
|
|
@@ -256,13 +253,11 @@ class Connection
|
|
256
253
|
return _connect if !listener? && !connected?
|
257
254
|
return accept if listener?
|
258
255
|
|
259
|
-
|
260
|
-
on_read @socket.read_nonblock( BLOCK_SIZE )
|
261
|
-
end
|
256
|
+
on_read @socket.read_nonblock( BLOCK_SIZE )
|
262
257
|
|
263
258
|
# Not ready to read or write yet, we'll catch it on future Reactor ticks.
|
264
259
|
rescue IO::WaitReadable, IO::WaitWritable
|
265
|
-
rescue
|
260
|
+
rescue => e
|
266
261
|
close e
|
267
262
|
end
|
268
263
|
|
@@ -282,22 +277,21 @@ class Connection
|
|
282
277
|
def _write
|
283
278
|
return _connect if !connected?
|
284
279
|
|
285
|
-
|
280
|
+
write_buffer.force_encoding( Encoding::BINARY )
|
281
|
+
chunk = write_buffer[0, BLOCK_SIZE]
|
286
282
|
total_written = 0
|
287
283
|
|
288
284
|
begin
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
chunk = chunk.byteslice( written..-1 )
|
300
|
-
end
|
285
|
+
# Send out the chunk, **all** of it, or at least try to.
|
286
|
+
loop do
|
287
|
+
total_written += written = @socket.write_nonblock( chunk )
|
288
|
+
write_buffer[0, written] = ''
|
289
|
+
|
290
|
+
# Call #on_write every time any of the buffer is consumed.
|
291
|
+
on_write
|
292
|
+
|
293
|
+
break if written == chunk.size
|
294
|
+
chunk[0, written] = ''
|
301
295
|
end
|
302
296
|
|
303
297
|
# Not ready to read or write yet, we'll catch it on future Reactor ticks.
|
@@ -310,7 +304,7 @@ class Connection
|
|
310
304
|
end
|
311
305
|
|
312
306
|
total_written
|
313
|
-
rescue
|
307
|
+
rescue => e
|
314
308
|
close e
|
315
309
|
end
|
316
310
|
|
data/lib/raktr/version.rb
CHANGED
data/lib/raktr.rb
CHANGED
@@ -195,15 +195,14 @@ class Raktr
|
|
195
195
|
block.call connection if block_given?
|
196
196
|
|
197
197
|
begin
|
198
|
-
|
199
|
-
|
200
|
-
connect_unix( options[:unix_socket] ) : connect_tcp
|
198
|
+
socket = options[:unix_socket] ?
|
199
|
+
connect_unix( options[:unix_socket] ) : connect_tcp
|
201
200
|
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
rescue Connection::Error => e
|
201
|
+
connection.configure options.merge( socket: socket, role: :client )
|
202
|
+
attach connection
|
203
|
+
rescue => e
|
206
204
|
connection.close e
|
205
|
+
raise
|
207
206
|
end
|
208
207
|
|
209
208
|
connection
|
@@ -258,16 +257,15 @@ class Raktr
|
|
258
257
|
server = server_handler.call
|
259
258
|
|
260
259
|
begin
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
listen_tcp( options[:host], options[:port] )
|
260
|
+
socket = options[:unix_socket] ?
|
261
|
+
listen_unix( options[:unix_socket] ) :
|
262
|
+
listen_tcp( options[:host], options[:port] )
|
265
263
|
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
rescue Connection::Error => e
|
264
|
+
server.configure options.merge( socket: socket, role: :server, server_handler: server_handler )
|
265
|
+
attach server
|
266
|
+
rescue => e
|
270
267
|
server.close e
|
268
|
+
raise
|
271
269
|
end
|
272
270
|
|
273
271
|
server
|
@@ -659,10 +657,8 @@ class Raktr
|
|
659
657
|
|
660
658
|
selected_sockets =
|
661
659
|
begin
|
662
|
-
|
663
|
-
|
664
|
-
end
|
665
|
-
rescue Connection::Error => e
|
660
|
+
select( r, w, e, @select_timeout )
|
661
|
+
rescue => e
|
666
662
|
nil
|
667
663
|
end
|
668
664
|
|
@@ -141,7 +141,7 @@ describe Raktr::Connection::TLS do
|
|
141
141
|
context 'and options have been provided' do
|
142
142
|
let(:client_ssl_options) { client_valid_ssl_options }
|
143
143
|
|
144
|
-
it "passes #{
|
144
|
+
it "passes #{OpenSSL::SSL::SSLError} to #on_error" do
|
145
145
|
error = nil
|
146
146
|
|
147
147
|
options = server_ssl_options.merge(
|
@@ -165,7 +165,7 @@ describe Raktr::Connection::TLS do
|
|
165
165
|
|
166
166
|
raktr.wait rescue Raktr::Error::NotRunning
|
167
167
|
|
168
|
-
error.should be_kind_of
|
168
|
+
error.should be_kind_of OpenSSL::SSL::SSLError
|
169
169
|
end
|
170
170
|
end
|
171
171
|
end
|
@@ -199,7 +199,7 @@ describe Raktr::Connection::TLS do
|
|
199
199
|
context 'and are invalid' do
|
200
200
|
let(:client_ssl_options) { client_invalid_ssl_options }
|
201
201
|
|
202
|
-
it "passes #{
|
202
|
+
it "passes #{OpenSSL::SSL::SSLError} to #on_error" do
|
203
203
|
error = nil
|
204
204
|
|
205
205
|
options = server_ssl_options.merge(
|
@@ -222,7 +222,7 @@ describe Raktr::Connection::TLS do
|
|
222
222
|
|
223
223
|
raktr.wait rescue Raktr::Error::NotRunning
|
224
224
|
|
225
|
-
error.should be_kind_of
|
225
|
+
error.should be_kind_of OpenSSL::SSL::SSLError
|
226
226
|
end
|
227
227
|
end
|
228
228
|
end
|
@@ -230,7 +230,7 @@ describe Raktr::Connection::TLS do
|
|
230
230
|
context 'and no options have been provided' do
|
231
231
|
let(:client_ssl_options) { {} }
|
232
232
|
|
233
|
-
it "passes #{
|
233
|
+
it "passes #{OpenSSL::SSL::SSLError} to #on_error" do
|
234
234
|
error = nil
|
235
235
|
|
236
236
|
options = server_ssl_options.merge(
|
@@ -254,7 +254,7 @@ describe Raktr::Connection::TLS do
|
|
254
254
|
|
255
255
|
raktr.wait rescue Raktr::Error::NotRunning
|
256
256
|
|
257
|
-
error.should be_kind_of
|
257
|
+
error.should be_kind_of OpenSSL::SSL::SSLError
|
258
258
|
end
|
259
259
|
end
|
260
260
|
end
|
@@ -302,13 +302,13 @@ describe Raktr::Connection::TLS do
|
|
302
302
|
let(:server_ssl_options) { server_valid_ssl_options }
|
303
303
|
|
304
304
|
context 'and no options have been provided' do
|
305
|
-
it "passes #{
|
305
|
+
it "passes #{OpenSSL::SSL::SSLError} to #on_error" do
|
306
306
|
connection = nil
|
307
307
|
raktr.run do
|
308
308
|
connection = raktr.connect( host, port, TLSHandler )
|
309
309
|
end
|
310
310
|
|
311
|
-
connection.error.should be_kind_of
|
311
|
+
connection.error.should be_kind_of OpenSSL::SSL::SSLError
|
312
312
|
end
|
313
313
|
end
|
314
314
|
|
@@ -332,13 +332,13 @@ describe Raktr::Connection::TLS do
|
|
332
332
|
end
|
333
333
|
|
334
334
|
context 'and are invalid' do
|
335
|
-
it "passes #{
|
335
|
+
it "passes #{OpenSSL::SSL::SSLError} to #on_error" do
|
336
336
|
connection = nil
|
337
337
|
raktr.run do
|
338
338
|
connection = raktr.connect( host, port, TLSHandler, client_invalid_ssl_options )
|
339
339
|
end
|
340
340
|
|
341
|
-
connection.error.should be_kind_of
|
341
|
+
connection.error.should be_kind_of OpenSSL::SSL::SSLError
|
342
342
|
end
|
343
343
|
end
|
344
344
|
end
|
data/spec/spec_helper.rb
CHANGED
data/spec/support/lib/servers.rb
CHANGED
@@ -578,7 +578,7 @@ shared_examples_for 'Raktr' do
|
|
578
578
|
end
|
579
579
|
|
580
580
|
context 'when the socket is invalid' do
|
581
|
-
it "calls #on_close with #{
|
581
|
+
it "calls #on_close with #{Errno::ENOENT}" do
|
582
582
|
outside_thread = Thread.current
|
583
583
|
subject.run do
|
584
584
|
Thread.current[:outside_thread] = outside_thread
|
@@ -591,7 +591,7 @@ shared_examples_for 'Raktr' do
|
|
591
591
|
end
|
592
592
|
end
|
593
593
|
|
594
|
-
Thread.current[:outside_thread][:error].should be_a_kind_of
|
594
|
+
Thread.current[:outside_thread][:error].should be_a_kind_of Errno::ENOENT
|
595
595
|
end
|
596
596
|
end
|
597
597
|
end
|
@@ -625,7 +625,7 @@ shared_examples_for 'Raktr' do
|
|
625
625
|
end
|
626
626
|
|
627
627
|
context 'when the host is invalid' do
|
628
|
-
it "calls #on_close with #{
|
628
|
+
it "calls #on_close with #{SocketError}" do
|
629
629
|
outside_thread = Thread.current
|
630
630
|
subject.run do
|
631
631
|
Thread.current[:outside_thread] = outside_thread
|
@@ -638,12 +638,12 @@ shared_examples_for 'Raktr' do
|
|
638
638
|
end
|
639
639
|
end
|
640
640
|
|
641
|
-
Thread.current[:outside_thread][:error].should be_a_kind_of
|
641
|
+
Thread.current[:outside_thread][:error].should be_a_kind_of SocketError
|
642
642
|
end
|
643
643
|
end
|
644
644
|
|
645
645
|
context 'when the port is invalid' do
|
646
|
-
it "calls #on_close with #{
|
646
|
+
it "calls #on_close with #{Errno::ECONNREFUSED}" do
|
647
647
|
outside_thread = Thread.current
|
648
648
|
subject.run do
|
649
649
|
Thread.current[:outside_thread] = outside_thread
|
@@ -663,9 +663,9 @@ shared_examples_for 'Raktr' do
|
|
663
663
|
end
|
664
664
|
end
|
665
665
|
|
666
|
-
[:error,
|
667
|
-
|
668
|
-
|
666
|
+
[:error, IOError,
|
667
|
+
Errno::ECONNREFUSED,
|
668
|
+
Errno::EPIPE
|
669
669
|
].should include Thread.current[:outside_thread][:error]
|
670
670
|
end
|
671
671
|
end
|
@@ -735,7 +735,7 @@ shared_examples_for 'Raktr' do
|
|
735
735
|
end
|
736
736
|
end
|
737
737
|
|
738
|
-
[:error,
|
738
|
+
[:error, Errno::EACCES].should include Thread.current[:outside_thread][:error]
|
739
739
|
end
|
740
740
|
end
|
741
741
|
end
|
@@ -777,7 +777,7 @@ shared_examples_for 'Raktr' do
|
|
777
777
|
end
|
778
778
|
end
|
779
779
|
|
780
|
-
[:error,
|
780
|
+
[:error, SocketError].should include Thread.current[:outside_thread][:error]
|
781
781
|
end
|
782
782
|
end
|
783
783
|
|
@@ -802,7 +802,7 @@ shared_examples_for 'Raktr' do
|
|
802
802
|
end
|
803
803
|
end
|
804
804
|
|
805
|
-
[:error,
|
805
|
+
[:error, Errno::EACCES].should include Thread.current[:outside_thread][:error]
|
806
806
|
end
|
807
807
|
end
|
808
808
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: raktr
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tasos Laskos
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-05-19 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: |2
|
14
14
|
Raktr is a simple, lightweight, pure-Ruby implementation of the Reactor
|
@@ -28,7 +28,6 @@ files:
|
|
28
28
|
- lib/raktr.rb
|
29
29
|
- lib/raktr/connection.rb
|
30
30
|
- lib/raktr/connection/callbacks.rb
|
31
|
-
- lib/raktr/connection/error.rb
|
32
31
|
- lib/raktr/connection/peer_info.rb
|
33
32
|
- lib/raktr/connection/tls.rb
|
34
33
|
- lib/raktr/global.rb
|
@@ -97,44 +96,44 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
97
96
|
- !ruby/object:Gem::Version
|
98
97
|
version: '0'
|
99
98
|
requirements: []
|
100
|
-
rubygems_version: 3.
|
99
|
+
rubygems_version: 3.4.13
|
101
100
|
signing_key:
|
102
101
|
specification_version: 4
|
103
102
|
summary: A pure-Ruby implementation of the Reactor pattern.
|
104
103
|
test_files:
|
105
|
-
- spec/raktr/connection/tls_spec.rb
|
106
104
|
- spec/raktr/connection_spec.rb
|
107
|
-
- spec/raktr/
|
105
|
+
- spec/raktr/tasks_spec.rb
|
108
106
|
- spec/raktr/queue_spec.rb
|
109
|
-
- spec/raktr/tasks/base.rb
|
110
107
|
- spec/raktr/tasks/delayed_spec.rb
|
111
108
|
- spec/raktr/tasks/one_off_spec.rb
|
109
|
+
- spec/raktr/tasks/base.rb
|
112
110
|
- spec/raktr/tasks/periodic_spec.rb
|
113
111
|
- spec/raktr/tasks/persistent_spec.rb
|
114
|
-
- spec/raktr/
|
115
|
-
- spec/
|
116
|
-
- spec/raktr_tls_spec.rb
|
112
|
+
- spec/raktr/iterator_spec.rb
|
113
|
+
- spec/raktr/connection/tls_spec.rb
|
117
114
|
- spec/spec_helper.rb
|
118
|
-
- spec/
|
119
|
-
- spec/support/
|
115
|
+
- spec/raktr_tls_spec.rb
|
116
|
+
- spec/support/helpers/utilities.rb
|
117
|
+
- spec/support/helpers/paths.rb
|
120
118
|
- spec/support/fixtures/handlers/echo_server.rb
|
121
119
|
- spec/support/fixtures/handlers/echo_server_tls.rb
|
120
|
+
- spec/support/fixtures/handlers/echo_client_tls.rb
|
121
|
+
- spec/support/fixtures/handlers/echo_client.rb
|
122
122
|
- spec/support/fixtures/pems/cacert.pem
|
123
|
-
- spec/support/fixtures/pems/client/cert.pem
|
124
|
-
- spec/support/fixtures/pems/client/foo-cert.pem
|
125
|
-
- spec/support/fixtures/pems/client/foo-key.pem
|
126
|
-
- spec/support/fixtures/pems/client/key.pem
|
127
123
|
- spec/support/fixtures/pems/server/cert.pem
|
128
124
|
- spec/support/fixtures/pems/server/key.pem
|
129
|
-
- spec/support/
|
130
|
-
- spec/support/
|
131
|
-
- spec/support/
|
132
|
-
- spec/support/
|
125
|
+
- spec/support/fixtures/pems/client/foo-key.pem
|
126
|
+
- spec/support/fixtures/pems/client/foo-cert.pem
|
127
|
+
- spec/support/fixtures/pems/client/cert.pem
|
128
|
+
- spec/support/fixtures/pems/client/key.pem
|
129
|
+
- spec/support/shared/task.rb
|
130
|
+
- spec/support/shared/raktr.rb
|
131
|
+
- spec/support/shared/connection.rb
|
133
132
|
- spec/support/lib/servers.rb
|
134
|
-
- spec/support/servers/
|
135
|
-
- spec/support/
|
133
|
+
- spec/support/lib/servers/runner.rb
|
134
|
+
- spec/support/lib/server_option_parser.rb
|
136
135
|
- spec/support/servers/echo_unix.rb
|
136
|
+
- spec/support/servers/echo_tls.rb
|
137
|
+
- spec/support/servers/echo.rb
|
137
138
|
- spec/support/servers/echo_unix_tls.rb
|
138
|
-
- spec/
|
139
|
-
- spec/support/shared/raktr.rb
|
140
|
-
- spec/support/shared/task.rb
|
139
|
+
- spec/raktr_spec.rb
|
@@ -1,120 +0,0 @@
|
|
1
|
-
=begin
|
2
|
-
|
3
|
-
This file is part of the Raktr project and may be subject to
|
4
|
-
redistribution and commercial restrictions. Please see the Raktr
|
5
|
-
web site for more information on licensing and terms of use.
|
6
|
-
|
7
|
-
=end
|
8
|
-
|
9
|
-
class Raktr
|
10
|
-
class Connection
|
11
|
-
|
12
|
-
# {Connection} error namespace.
|
13
|
-
#
|
14
|
-
# All {Connection} errors inherit from and live under it.
|
15
|
-
#
|
16
|
-
# @author Tasos "Zapotek" Laskos <tasos.laskos@gmail.com>
|
17
|
-
class Error < Raktr::Error
|
18
|
-
|
19
|
-
class << self
|
20
|
-
# Captures Ruby exceptions and converts them to an appropriate
|
21
|
-
# subclass of {Error}.
|
22
|
-
#
|
23
|
-
# @param [Block] block Block to run.
|
24
|
-
def translate( &block )
|
25
|
-
block.call
|
26
|
-
rescue IOError, Errno::ENOTCONN, Errno::ENOTSOCK => e
|
27
|
-
raise_with_proper_backtrace( e, Closed )
|
28
|
-
rescue SocketError, Errno::ENOENT => e
|
29
|
-
raise_with_proper_backtrace( e, HostNotFound )
|
30
|
-
rescue Errno::EPIPE => e
|
31
|
-
raise_with_proper_backtrace( e, BrokenPipe )
|
32
|
-
rescue Errno::ECONNREFUSED,
|
33
|
-
# JRuby throws Errno::EADDRINUSE when trying to connect to a
|
34
|
-
# non-existent server.
|
35
|
-
Errno::EADDRINUSE => e
|
36
|
-
raise_with_proper_backtrace( e, Refused )
|
37
|
-
rescue Errno::ECONNRESET, Errno::ECONNABORTED => e
|
38
|
-
raise_with_proper_backtrace( e, Reset )
|
39
|
-
rescue Errno::EACCES => e
|
40
|
-
raise_with_proper_backtrace( e, Permission )
|
41
|
-
rescue Errno::EBADF => e
|
42
|
-
raise_with_proper_backtrace( e, BadSocket )
|
43
|
-
|
44
|
-
# Catch and forward these before handling OpenSSL::OpenSSLError because
|
45
|
-
# all SSL errors inherit from it, including OpenSSL::SSL::SSLErrorWaitReadable
|
46
|
-
# and OpenSSL::SSL::SSLErrorWaitWritable which also inherit from
|
47
|
-
# IO::WaitReadable and IO::WaitWritable and need special treatment.
|
48
|
-
rescue IO::WaitReadable, IO::WaitWritable, Errno::EINPROGRESS
|
49
|
-
raise
|
50
|
-
|
51
|
-
# We're mainly interested in translating SSL handshake errors but there
|
52
|
-
# aren't any specific exceptions for these.
|
53
|
-
#
|
54
|
-
# Why make things easy and clean, right?
|
55
|
-
rescue OpenSSL::SSL::SSLError, OpenSSL::OpenSSLError => e
|
56
|
-
raise_with_proper_backtrace( e, SSL )
|
57
|
-
end
|
58
|
-
|
59
|
-
def raise_with_proper_backtrace( ruby, raktr )
|
60
|
-
e = raktr.new( ruby.to_s )
|
61
|
-
e.set_backtrace ruby.backtrace
|
62
|
-
raise e
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
# Like a `SocketError.getaddrinfo` exception.
|
67
|
-
#
|
68
|
-
# @author Tasos "Zapotek" Laskos <tasos.laskos@gmail.com>
|
69
|
-
class HostNotFound < Error
|
70
|
-
end
|
71
|
-
|
72
|
-
# Like a `Errno::EACCES` exception.
|
73
|
-
#
|
74
|
-
# @author Tasos "Zapotek" Laskos <tasos.laskos@gmail.com>
|
75
|
-
class Permission < Error
|
76
|
-
end
|
77
|
-
|
78
|
-
# Like a `Errno::ECONNREFUSED` exception.
|
79
|
-
#
|
80
|
-
# @author Tasos "Zapotek" Laskos <tasos.laskos@gmail.com>
|
81
|
-
class Refused < Error
|
82
|
-
end
|
83
|
-
|
84
|
-
# Like a `Errno::ECONNRESET` exception.
|
85
|
-
#
|
86
|
-
# @author Tasos "Zapotek" Laskos <tasos.laskos@gmail.com>
|
87
|
-
class Reset < Error
|
88
|
-
end
|
89
|
-
|
90
|
-
# Like a `Errno::EPIPE` exception.
|
91
|
-
#
|
92
|
-
# @author Tasos "Zapotek" Laskos <tasos.laskos@gmail.com>
|
93
|
-
class BrokenPipe < Error
|
94
|
-
end
|
95
|
-
|
96
|
-
# @author Tasos "Zapotek" Laskos <tasos.laskos@gmail.com>
|
97
|
-
class Timeout < Error
|
98
|
-
end
|
99
|
-
|
100
|
-
# Like a `IOError` exception.
|
101
|
-
#
|
102
|
-
# @author Tasos "Zapotek" Laskos <tasos.laskos@gmail.com>
|
103
|
-
class Closed < Error
|
104
|
-
end
|
105
|
-
|
106
|
-
# Like a `Errno::EBADF` exception.
|
107
|
-
#
|
108
|
-
# @author Tasos "Zapotek" Laskos <tasos.laskos@gmail.com>
|
109
|
-
class BadSocket < Error
|
110
|
-
end
|
111
|
-
|
112
|
-
# Like a `OpenSSL::OpenSSLError` exception.
|
113
|
-
#
|
114
|
-
# @author Tasos "Zapotek" Laskos <tasos.laskos@gmail.com>
|
115
|
-
class SSL < Error
|
116
|
-
end
|
117
|
-
|
118
|
-
end
|
119
|
-
end
|
120
|
-
end
|