celluloid-io 0.16.2 → 0.16.5.pre0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.env-ci +4 -0
- data/.env-dev +4 -0
- data/.gitmodules +3 -0
- data/.travis.yml +22 -6
- data/CHANGES.md +15 -11
- data/Gemfile +2 -5
- data/celluloid-io.gemspec +3 -5
- data/lib/celluloid/io/mailbox.rb +1 -1
- data/lib/celluloid/io/ssl_socket.rb +15 -2
- data/lib/celluloid/io/tcp_socket.rb +4 -2
- data/lib/celluloid/io/version.rb +1 -1
- data/spec/celluloid/io/dns_resolver_spec.rb +7 -7
- data/spec/celluloid/io/reactor_spec.rb +1 -1
- data/spec/celluloid/io/ssl_server_spec.rb +7 -7
- data/spec/celluloid/io/ssl_socket_spec.rb +32 -26
- data/spec/celluloid/io/tcp_server_spec.rb +6 -6
- data/spec/celluloid/io/tcp_socket_spec.rb +18 -18
- data/spec/celluloid/io/udp_socket_spec.rb +4 -4
- data/spec/celluloid/io/unix_server_spec.rb +14 -9
- data/spec/celluloid/io/unix_socket_spec.rb +22 -18
- data/spec/spec_helper.rb +2 -3
- metadata +215 -62
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bf0058f46b15fb91d5363861cc8035e0f41f6396
|
4
|
+
data.tar.gz: cad3855d8ca89f73731dceaa18716ba25f315484
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 39ce8ad8e39920264f26c199bf14e5dbd03c6e97943d7d5a636e68d6e9cc687aa79d14b3d6542ff5af8e11eb19e118e8ff3b262fd61966c89814d3966bcfc0fb
|
7
|
+
data.tar.gz: 03ffeaedee0b08276537ff5cfedf5d11157c34c932129f1c394626ff45923b93867901bb67f2718e5fe6b032649dd7112d910c527c983e82b1c8c6c7c532f026
|
data/.env-ci
ADDED
data/.env-dev
ADDED
data/.gitmodules
ADDED
data/.travis.yml
CHANGED
@@ -1,19 +1,35 @@
|
|
1
1
|
script: rake ci
|
2
|
+
language: ruby
|
2
3
|
rvm:
|
3
|
-
-
|
4
|
-
- 2.
|
5
|
-
- 2.1.1
|
6
|
-
- ruby-head
|
4
|
+
- 2.2.0
|
5
|
+
- 2.2.2
|
7
6
|
- jruby
|
7
|
+
- ruby-head
|
8
8
|
- jruby-head
|
9
9
|
- rbx-2
|
10
10
|
|
11
|
+
# TODO: Put these back:
|
12
|
+
# * CELLULOID_TASK_CLASS=Fibered
|
13
|
+
# * CELLULOID_TASK_CLASS=Threaded
|
14
|
+
# For right now the imporant thing is to test BACKPORTED mode:
|
15
|
+
|
11
16
|
matrix:
|
17
|
+
fast_finish: true
|
12
18
|
allow_failures:
|
19
|
+
- rvm: rbx-2
|
13
20
|
- rvm: ruby-head
|
14
|
-
- rvm: jruby
|
15
21
|
- rvm: jruby-head
|
16
|
-
-
|
22
|
+
- env: CELLULOID_BACKPORTED=true
|
23
|
+
|
24
|
+
env:
|
25
|
+
matrix:
|
26
|
+
- CELLULOID_BACKPORTED=true
|
27
|
+
- CELLULOID_BACKPORTED=false
|
28
|
+
global:
|
29
|
+
- NUMBER_OF_PROCESSORS=2 CELLULOID_CONFIG_FILE=.env-ci
|
17
30
|
|
18
31
|
notifications:
|
19
32
|
irc: "irc.freenode.org#celluloid"
|
33
|
+
|
34
|
+
sudo: false
|
35
|
+
install: bundle install --without=development
|
data/CHANGES.md
CHANGED
@@ -1,21 +1,25 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
HEAD
|
2
|
+
-----
|
3
|
+
* Adjust class name for Celluloid::Mailbox::Evented, per 0.17.0 of Celluloid.
|
4
|
+
|
5
|
+
0.16.2 (2015-01-30)
|
6
|
+
-----
|
3
7
|
* More TCPSocket compatibility fixes
|
4
8
|
* Ensure monitors are closed when tasks resume
|
5
9
|
* Fix Errno::EAGAIN handling in Stream#syswrite
|
6
10
|
|
7
11
|
0.16.1 (2014-10-08)
|
8
|
-
|
12
|
+
-----
|
9
13
|
* Revert read/write interest patch as it caused file descriptor leaks
|
10
14
|
|
11
15
|
0.16.0 (2014-09-04)
|
12
|
-
|
16
|
+
-----
|
13
17
|
* Fix bug handling simultaneous read/write interests
|
14
18
|
* Use Resolv::DNS::Config to obtain nameservers
|
15
19
|
* Celluloid::IO.copy_stream support (uses a background thread)
|
16
20
|
|
17
21
|
0.15.0 (2013-09-04)
|
18
|
-
|
22
|
+
-----
|
19
23
|
* Improved DNS resolver with less NIH and more Ruby stdlib goodness
|
20
24
|
* Better match Ruby stdlib TCPServer API
|
21
25
|
* Add missing #send and #recv on Celluloid::IO::TCPSocket
|
@@ -23,16 +27,16 @@
|
|
23
27
|
* Add missing #peeraddr method on Celluloid::IO::SSLSocket
|
24
28
|
|
25
29
|
0.14.0 (2013-05-07)
|
26
|
-
|
30
|
+
-----
|
27
31
|
* Add `close_read`/`close_write` delegates for rack-hijack support
|
28
32
|
* Depend on EventedMailbox from core
|
29
33
|
|
30
34
|
0.13.1
|
31
|
-
|
35
|
+
-----
|
32
36
|
* Remove overhead for `wait_readable`/`wait_writable`
|
33
37
|
|
34
38
|
0.13.0
|
35
|
-
|
39
|
+
-----
|
36
40
|
* Support for many, many more IO methods, particularly line-oriented
|
37
41
|
methods like #gets, #readline, and #readlines
|
38
42
|
* Initial SSL support via Celluloid::IO::SSLSocket and
|
@@ -42,15 +46,15 @@
|
|
42
46
|
* Celluloid 0.13 compatibility fixes
|
43
47
|
|
44
48
|
0.12.0
|
45
|
-
|
49
|
+
-----
|
46
50
|
* Tracking release for Celluloid 0.12.0
|
47
51
|
|
48
52
|
0.11.0
|
49
|
-
|
53
|
+
-----
|
50
54
|
* "Unofficial" SSL support (via nio4r 0.4.0)
|
51
55
|
|
52
56
|
0.10.0
|
53
|
-
|
57
|
+
-----
|
54
58
|
* Read/write operations are now atomic across tasks
|
55
59
|
* True non-blocking connect support
|
56
60
|
* Non-blocking DNS resolution support
|
data/Gemfile
CHANGED
data/celluloid-io.gemspec
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
|
-
require File.expand_path(
|
2
|
+
require File.expand_path("../culture/sync", __FILE__)
|
3
3
|
|
4
4
|
Gem::Specification.new do |gem|
|
5
5
|
gem.name = "celluloid-io"
|
@@ -16,12 +16,10 @@ Gem::Specification.new do |gem|
|
|
16
16
|
gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
17
17
|
gem.require_paths = ["lib"]
|
18
18
|
|
19
|
-
gem
|
19
|
+
Celluloid::Sync::Gemspec[gem]
|
20
|
+
|
20
21
|
gem.add_dependency 'nio4r', '>= 1.1.0'
|
21
22
|
|
22
|
-
gem.add_development_dependency 'rake'
|
23
|
-
gem.add_development_dependency 'rspec', '~> 2.14.0'
|
24
|
-
gem.add_development_dependency 'benchmark_suite'
|
25
23
|
gem.add_development_dependency 'guard-rspec'
|
26
24
|
gem.add_development_dependency 'rb-fsevent', '~> 0.9.1' if RUBY_PLATFORM =~ /darwin/
|
27
25
|
end
|
data/lib/celluloid/io/mailbox.rb
CHANGED
@@ -6,13 +6,26 @@ module Celluloid
|
|
6
6
|
class SSLSocket < Stream
|
7
7
|
extend Forwardable
|
8
8
|
|
9
|
-
def_delegators :@socket,
|
10
|
-
:
|
9
|
+
def_delegators :@socket,
|
10
|
+
:read_nonblock,
|
11
|
+
:write_nonblock,
|
12
|
+
:close,
|
13
|
+
:closed?,
|
14
|
+
:cert,
|
15
|
+
:cipher,
|
16
|
+
:client_ca,
|
17
|
+
:peeraddr,
|
18
|
+
:peer_cert,
|
19
|
+
:peer_cert_chain,
|
20
|
+
:post_connection_check,
|
21
|
+
:verify_result,
|
22
|
+
:sync_close=
|
11
23
|
|
12
24
|
def initialize(io, ctx = OpenSSL::SSL::SSLContext.new)
|
13
25
|
super()
|
14
26
|
@context = ctx
|
15
27
|
@socket = OpenSSL::SSL::SSLSocket.new(::IO.try_convert(io), @context)
|
28
|
+
@socket.sync_close = true if @socket.respond_to?(:sync_close=)
|
16
29
|
end
|
17
30
|
|
18
31
|
def connect
|
@@ -80,13 +80,15 @@ module Celluloid
|
|
80
80
|
|
81
81
|
begin
|
82
82
|
@socket.connect_nonblock Socket.sockaddr_in(remote_port, @addr.to_s)
|
83
|
-
rescue Errno::EINPROGRESS
|
83
|
+
rescue Errno::EINPROGRESS, Errno::EALREADY
|
84
|
+
# JRuby raises EINPROGRESS, MRI raises EALREADY
|
85
|
+
|
84
86
|
wait_writable
|
85
87
|
|
86
88
|
# HAX: for some reason we need to finish_connect ourselves on JRuby
|
87
89
|
# This logic is unnecessary but JRuby still throws Errno::EINPROGRESS
|
88
90
|
# if we retry the non-blocking connect instead of just finishing it
|
89
|
-
retry unless
|
91
|
+
retry unless RUBY_PLATFORM == 'java' && @socket.to_channel.finish_connect
|
90
92
|
rescue Errno::EISCONN
|
91
93
|
# We're now connected! Yay exceptions for flow control
|
92
94
|
# NOTE: This is the approach the Ruby stdlib docs suggest ;_;
|
data/lib/celluloid/io/version.rb
CHANGED
@@ -5,14 +5,14 @@ describe Celluloid::IO::DNSResolver do
|
|
5
5
|
it 'resolves hostnames statically from hosts file without nameservers' do
|
6
6
|
# /etc/resolv.conf doesn't exist on Mac OSX when no networking is
|
7
7
|
# disabled, thus .nameservers would return nil
|
8
|
-
Celluloid::IO::DNSResolver.
|
8
|
+
expect(Celluloid::IO::DNSResolver).to receive(:nameservers).at_most(:once) { nil }
|
9
9
|
resolver = Celluloid::IO::DNSResolver.new
|
10
|
-
resolver.resolve('localhost').
|
10
|
+
expect(resolver.resolve('localhost')).to eq Resolv::IPv4.create("127.0.0.1")
|
11
11
|
end
|
12
12
|
|
13
13
|
it 'resolves hostnames' do
|
14
14
|
resolver = Celluloid::IO::DNSResolver.new
|
15
|
-
resolver.resolve('localhost').
|
15
|
+
expect(resolver.resolve('localhost')).to eq Resolv::IPv4.create("127.0.0.1")
|
16
16
|
end
|
17
17
|
|
18
18
|
it "resolves domain names" do
|
@@ -26,17 +26,17 @@ describe Celluloid::IO::DNSResolver do
|
|
26
26
|
resolver = Celluloid::IO::DNSResolver.new
|
27
27
|
results = resolver.resolve("www.google.com")
|
28
28
|
if results.is_a?(Array)
|
29
|
-
results.all? {|i| i.
|
29
|
+
results.all? {|i| expect(i).to be_an_instance_of(Resolv::IPv4) }
|
30
30
|
else
|
31
|
-
results.
|
31
|
+
expect(results).to be_an_instance_of(Resolv::IPv4)
|
32
32
|
end
|
33
33
|
# www.yahoo.com will be resolved randomly whether multiple or
|
34
34
|
# single entry.
|
35
35
|
results = resolver.resolve("www.yahoo.com")
|
36
36
|
if results.is_a?(Array)
|
37
|
-
results.all? {|i| i.
|
37
|
+
results.all? {|i| expect(i).to be_an_instance_of(Resolv::IPv4) }
|
38
38
|
else
|
39
|
-
results.
|
39
|
+
expect(results).to be_an_instance_of(Resolv::IPv4)
|
40
40
|
end
|
41
41
|
end
|
42
42
|
end
|
@@ -25,7 +25,7 @@ describe Celluloid::IO::SSLServer do
|
|
25
25
|
context "inside Celluloid::IO" do
|
26
26
|
it "should be evented" do
|
27
27
|
with_ssl_server do |subject|
|
28
|
-
within_io_actor { Celluloid::IO.evented? }.
|
28
|
+
expect(within_io_actor { Celluloid::IO.evented? }).to be_truthy
|
29
29
|
end
|
30
30
|
end
|
31
31
|
|
@@ -36,11 +36,11 @@ describe Celluloid::IO::SSLServer do
|
|
36
36
|
OpenSSL::SSL::SSLSocket.new(raw, client_context).connect
|
37
37
|
end
|
38
38
|
peer = within_io_actor { subject.accept }
|
39
|
-
peer.
|
39
|
+
expect(peer).to be_a Celluloid::IO::SSLSocket
|
40
40
|
|
41
41
|
client = thread.value
|
42
42
|
client.write payload
|
43
|
-
peer.read(payload.size).
|
43
|
+
expect(peer.read(payload.size)).to eq payload
|
44
44
|
end
|
45
45
|
end
|
46
46
|
end
|
@@ -48,7 +48,7 @@ describe Celluloid::IO::SSLServer do
|
|
48
48
|
context "outside Celluloid::IO" do
|
49
49
|
it "should be blocking" do
|
50
50
|
with_ssl_server do |subject|
|
51
|
-
Celluloid::IO.
|
51
|
+
expect(Celluloid::IO).not_to be_evented
|
52
52
|
end
|
53
53
|
end
|
54
54
|
|
@@ -59,11 +59,11 @@ describe Celluloid::IO::SSLServer do
|
|
59
59
|
OpenSSL::SSL::SSLSocket.new(raw, client_context).connect
|
60
60
|
end
|
61
61
|
peer = subject.accept
|
62
|
-
peer.
|
62
|
+
expect(peer).to be_a Celluloid::IO::SSLSocket
|
63
63
|
|
64
64
|
client = thread.value
|
65
65
|
client.write payload
|
66
|
-
peer.read(payload.size).
|
66
|
+
expect(peer.read(payload.size)).to eq payload
|
67
67
|
end
|
68
68
|
end
|
69
69
|
end
|
@@ -73,7 +73,7 @@ describe Celluloid::IO::SSLServer do
|
|
73
73
|
it "should auto-wrap a raw ::TCPServer" do
|
74
74
|
raw_server = ::TCPServer.new(example_addr, example_ssl_port)
|
75
75
|
with_ssl_server(raw_server) do |ssl_server|
|
76
|
-
ssl_server.tcp_server.class.
|
76
|
+
expect(ssl_server.tcp_server.class).to eq(Celluloid::IO::TCPServer)
|
77
77
|
end
|
78
78
|
end
|
79
79
|
end
|
@@ -72,35 +72,38 @@ describe Celluloid::IO::SSLSocket do
|
|
72
72
|
with_ssl_sockets do |ssl_client, ssl_peer|
|
73
73
|
within_io_actor do
|
74
74
|
ssl_peer << request
|
75
|
-
ssl_client.read(request.size).
|
75
|
+
expect(ssl_client.read(request.size)).to eq(request)
|
76
76
|
|
77
77
|
ssl_client << response
|
78
|
-
ssl_peer.read(response.size).
|
78
|
+
expect(ssl_peer.read(response.size)).to eq(response)
|
79
79
|
end
|
80
80
|
end
|
81
81
|
end
|
82
82
|
|
83
83
|
it "starts SSL on a connected TCP socket" do
|
84
|
-
|
84
|
+
if RUBY_PLATFORM == 'java'
|
85
|
+
pending "JRuby support"
|
86
|
+
fail "Bypassing potential deadlock."
|
87
|
+
end
|
85
88
|
with_raw_sockets do |client, peer|
|
86
89
|
within_io_actor do
|
87
90
|
peer << request
|
88
|
-
client.read(request.size).
|
91
|
+
expect(client.read(request.size)).to eq(request)
|
89
92
|
|
90
93
|
client << response
|
91
|
-
peer.read(response.size).
|
94
|
+
expect(peer.read(response.size)).to eq(response)
|
92
95
|
|
93
96
|
# now that we've written bytes, upgrade to SSL
|
94
97
|
client_thread = Thread.new { OpenSSL::SSL::SSLSocket.new(client).connect }
|
95
98
|
ssl_peer = Celluloid::IO::SSLSocket.new peer, server_context
|
96
|
-
ssl_peer.
|
99
|
+
expect(ssl_peer).to eq(ssl_peer.accept)
|
97
100
|
ssl_client = client_thread.value
|
98
101
|
|
99
102
|
ssl_peer << request
|
100
|
-
ssl_client.read(request.size).
|
103
|
+
expect(ssl_client.read(request.size)).to eq(request)
|
101
104
|
|
102
105
|
ssl_client << response
|
103
|
-
ssl_peer.read(response.size).
|
106
|
+
expect(ssl_peer.read(response.size)).to eq(response)
|
104
107
|
end
|
105
108
|
end
|
106
109
|
end
|
@@ -110,80 +113,83 @@ describe Celluloid::IO::SSLSocket do
|
|
110
113
|
it "connects to SSL servers over TCP" do
|
111
114
|
with_ssl_sockets do |ssl_client, ssl_peer|
|
112
115
|
ssl_peer << request
|
113
|
-
ssl_client.read(request.size).
|
116
|
+
expect(ssl_client.read(request.size)).to eq(request)
|
114
117
|
|
115
118
|
ssl_client << response
|
116
|
-
ssl_peer.read(response.size).
|
119
|
+
expect(ssl_peer.read(response.size)).to eq(response)
|
117
120
|
end
|
118
121
|
end
|
119
122
|
|
120
123
|
it "starts SSL on a connected TCP socket" do
|
121
|
-
|
124
|
+
if RUBY_PLATFORM == 'java'
|
125
|
+
pending "JRuby support"
|
126
|
+
fail "Bypassing potential deadlock."
|
127
|
+
end
|
122
128
|
with_raw_sockets do |client, peer|
|
123
129
|
peer << request
|
124
|
-
client.read(request.size).
|
130
|
+
expect(client.read(request.size)).to eq(request)
|
125
131
|
|
126
132
|
client << response
|
127
|
-
peer.read(response.size).
|
133
|
+
expect(peer.read(response.size)).to eq(response)
|
128
134
|
|
129
135
|
# now that we've written bytes, upgrade to SSL
|
130
136
|
client_thread = Thread.new { OpenSSL::SSL::SSLSocket.new(client).connect }
|
131
137
|
ssl_peer = Celluloid::IO::SSLSocket.new peer, server_context
|
132
|
-
ssl_peer.
|
138
|
+
expect(ssl_peer).to eq(ssl_peer.accept)
|
133
139
|
ssl_client = client_thread.value
|
134
140
|
|
135
141
|
ssl_peer << request
|
136
|
-
ssl_client.read(request.size).
|
142
|
+
expect(ssl_client.read(request.size)).to eq(request)
|
137
143
|
|
138
144
|
ssl_client << response
|
139
|
-
ssl_peer.read(response.size).
|
145
|
+
expect(ssl_peer.read(response.size)).to eq(response)
|
140
146
|
end
|
141
147
|
end
|
142
148
|
end
|
143
149
|
|
144
150
|
it "knows its cert" do
|
145
151
|
# FIXME: seems bad? o_O
|
146
|
-
pending "wtf is wrong with this on JRuby" if
|
152
|
+
pending "wtf is wrong with this on JRuby" if RUBY_PLATFORM == 'java'
|
147
153
|
with_ssl_sockets do |ssl_client|
|
148
|
-
ssl_client.cert.to_der.
|
154
|
+
expect(ssl_client.cert.to_der).to eq(client_cert.to_der)
|
149
155
|
end
|
150
156
|
end
|
151
157
|
|
152
158
|
it "knows its peer_cert" do
|
153
159
|
with_ssl_sockets do |ssl_client|
|
154
|
-
ssl_client.peer_cert.to_der.
|
160
|
+
expect(ssl_client.peer_cert.to_der).to eq(ssl_client.to_io.peer_cert.to_der)
|
155
161
|
end
|
156
162
|
end
|
157
163
|
|
158
164
|
it "knows its peer_cert_chain" do
|
159
165
|
with_ssl_sockets do |ssl_client|
|
160
|
-
ssl_client.peer_cert_chain.zip(ssl_client.to_io.peer_cert_chain).map do |c1, c2|
|
166
|
+
expect(ssl_client.peer_cert_chain.zip(ssl_client.to_io.peer_cert_chain).map do |c1, c2|
|
161
167
|
c1.to_der == c2.to_der
|
162
|
-
end.
|
168
|
+
end).to be_all
|
163
169
|
end
|
164
170
|
end
|
165
171
|
|
166
172
|
it "knows its cipher" do
|
167
173
|
with_ssl_sockets do |ssl_client|
|
168
|
-
ssl_client.cipher.
|
174
|
+
expect(ssl_client.cipher).to eq(ssl_client.to_io.cipher)
|
169
175
|
end
|
170
176
|
end
|
171
177
|
|
172
178
|
it "knows its client_ca" do
|
173
179
|
# jruby-openssl does not implement this method
|
174
|
-
pending "jruby-openssl support" if
|
180
|
+
pending "jruby-openssl support" if RUBY_PLATFORM == 'java'
|
175
181
|
|
176
182
|
with_ssl_sockets do |ssl_client|
|
177
|
-
ssl_client.client_ca.
|
183
|
+
expect(ssl_client.client_ca).to eq(ssl_client.to_io.client_ca)
|
178
184
|
end
|
179
185
|
end
|
180
186
|
|
181
187
|
it "verifies peer certificates" do
|
182
188
|
# FIXME: JRuby seems to be giving the wrong result here o_O
|
183
|
-
pending "jruby-openssl support" if
|
189
|
+
pending "jruby-openssl support" if RUBY_PLATFORM == 'java'
|
184
190
|
|
185
191
|
with_ssl_sockets do |ssl_client, ssl_peer|
|
186
|
-
ssl_client.verify_result.
|
192
|
+
expect(ssl_client.verify_result).to eq(OpenSSL::X509::V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT)
|
187
193
|
end
|
188
194
|
end
|
189
195
|
|