wj_eventmachine 1.3.0.dev.1
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 +7 -0
- data/CHANGELOG.md +179 -0
- data/GNU +281 -0
- data/LICENSE +60 -0
- data/README.md +110 -0
- data/docs/DocumentationGuidesIndex.md +27 -0
- data/docs/GettingStarted.md +520 -0
- data/docs/old/ChangeLog +211 -0
- data/docs/old/DEFERRABLES +246 -0
- data/docs/old/EPOLL +141 -0
- data/docs/old/INSTALL +13 -0
- data/docs/old/KEYBOARD +42 -0
- data/docs/old/LEGAL +25 -0
- data/docs/old/LIGHTWEIGHT_CONCURRENCY +130 -0
- data/docs/old/PURE_RUBY +75 -0
- data/docs/old/RELEASE_NOTES +94 -0
- data/docs/old/SMTP +4 -0
- data/docs/old/SPAWNED_PROCESSES +148 -0
- data/docs/old/TODO +8 -0
- data/examples/guides/getting_started/01_eventmachine_echo_server.rb +18 -0
- data/examples/guides/getting_started/02_eventmachine_echo_server_that_recognizes_exit_command.rb +22 -0
- data/examples/guides/getting_started/03_simple_chat_server.rb +149 -0
- data/examples/guides/getting_started/04_simple_chat_server_step_one.rb +27 -0
- data/examples/guides/getting_started/05_simple_chat_server_step_two.rb +43 -0
- data/examples/guides/getting_started/06_simple_chat_server_step_three.rb +98 -0
- data/examples/guides/getting_started/07_simple_chat_server_step_four.rb +121 -0
- data/examples/guides/getting_started/08_simple_chat_server_step_five.rb +141 -0
- data/examples/old/ex_channel.rb +43 -0
- data/examples/old/ex_queue.rb +2 -0
- data/examples/old/ex_tick_loop_array.rb +15 -0
- data/examples/old/ex_tick_loop_counter.rb +32 -0
- data/examples/old/helper.rb +2 -0
- data/ext/binder.cpp +124 -0
- data/ext/binder.h +52 -0
- data/ext/cmain.cpp +1046 -0
- data/ext/ed.cpp +2238 -0
- data/ext/ed.h +460 -0
- data/ext/em.cpp +2378 -0
- data/ext/em.h +266 -0
- data/ext/eventmachine.h +152 -0
- data/ext/extconf.rb +285 -0
- data/ext/fastfilereader/extconf.rb +120 -0
- data/ext/fastfilereader/mapper.cpp +214 -0
- data/ext/fastfilereader/mapper.h +59 -0
- data/ext/fastfilereader/rubymain.cpp +126 -0
- data/ext/kb.cpp +79 -0
- data/ext/page.cpp +107 -0
- data/ext/page.h +51 -0
- data/ext/pipe.cpp +354 -0
- data/ext/project.h +174 -0
- data/ext/rubymain.cpp +1610 -0
- data/ext/ssl.cpp +627 -0
- data/ext/ssl.h +103 -0
- data/ext/wait_for_single_fd.h +36 -0
- data/java/.classpath +8 -0
- data/java/.project +17 -0
- data/java/src/com/rubyeventmachine/EmReactor.java +625 -0
- data/java/src/com/rubyeventmachine/EmReactorException.java +40 -0
- data/java/src/com/rubyeventmachine/EmReactorInterface.java +70 -0
- data/java/src/com/rubyeventmachine/EventableChannel.java +72 -0
- data/java/src/com/rubyeventmachine/EventableDatagramChannel.java +201 -0
- data/java/src/com/rubyeventmachine/EventableSocketChannel.java +415 -0
- data/java/src/com/rubyeventmachine/NullEmReactor.java +157 -0
- data/java/src/com/rubyeventmachine/NullEventableChannel.java +81 -0
- data/lib/em/buftok.rb +59 -0
- data/lib/em/callback.rb +58 -0
- data/lib/em/channel.rb +69 -0
- data/lib/em/completion.rb +307 -0
- data/lib/em/connection.rb +776 -0
- data/lib/em/deferrable.rb +210 -0
- data/lib/em/deferrable/pool.rb +2 -0
- data/lib/em/file_watch.rb +73 -0
- data/lib/em/future.rb +61 -0
- data/lib/em/io_streamer.rb +68 -0
- data/lib/em/iterator.rb +252 -0
- data/lib/em/messages.rb +66 -0
- data/lib/em/pool.rb +151 -0
- data/lib/em/process_watch.rb +45 -0
- data/lib/em/processes.rb +123 -0
- data/lib/em/protocols.rb +37 -0
- data/lib/em/protocols/header_and_content.rb +138 -0
- data/lib/em/protocols/httpclient.rb +303 -0
- data/lib/em/protocols/httpclient2.rb +602 -0
- data/lib/em/protocols/line_and_text.rb +125 -0
- data/lib/em/protocols/line_protocol.rb +33 -0
- data/lib/em/protocols/linetext2.rb +179 -0
- data/lib/em/protocols/memcache.rb +331 -0
- data/lib/em/protocols/object_protocol.rb +46 -0
- data/lib/em/protocols/postgres3.rb +246 -0
- data/lib/em/protocols/saslauth.rb +175 -0
- data/lib/em/protocols/smtpclient.rb +394 -0
- data/lib/em/protocols/smtpserver.rb +666 -0
- data/lib/em/protocols/socks4.rb +66 -0
- data/lib/em/protocols/stomp.rb +205 -0
- data/lib/em/protocols/tcptest.rb +54 -0
- data/lib/em/pure_ruby.rb +1299 -0
- data/lib/em/queue.rb +80 -0
- data/lib/em/resolver.rb +232 -0
- data/lib/em/spawnable.rb +84 -0
- data/lib/em/streamer.rb +118 -0
- data/lib/em/threaded_resource.rb +90 -0
- data/lib/em/tick_loop.rb +85 -0
- data/lib/em/timers.rb +61 -0
- data/lib/em/version.rb +3 -0
- data/lib/eventmachine.rb +1602 -0
- data/lib/jeventmachine.rb +318 -0
- data/rakelib/package.rake +120 -0
- data/rakelib/test.rake +6 -0
- data/rakelib/test_pure.rake +11 -0
- data/tests/client.crt +31 -0
- data/tests/client.key +51 -0
- data/tests/dhparam.pem +13 -0
- data/tests/em_ssl_handlers.rb +153 -0
- data/tests/em_test_helper.rb +198 -0
- data/tests/jruby/test_jeventmachine.rb +38 -0
- data/tests/test_attach.rb +199 -0
- data/tests/test_basic.rb +321 -0
- data/tests/test_channel.rb +75 -0
- data/tests/test_completion.rb +178 -0
- data/tests/test_connection_count.rb +83 -0
- data/tests/test_connection_write.rb +35 -0
- data/tests/test_defer.rb +35 -0
- data/tests/test_deferrable.rb +35 -0
- data/tests/test_epoll.rb +141 -0
- data/tests/test_error_handler.rb +38 -0
- data/tests/test_exc.rb +37 -0
- data/tests/test_file_watch.rb +86 -0
- data/tests/test_fork.rb +75 -0
- data/tests/test_futures.rb +170 -0
- data/tests/test_handler_check.rb +35 -0
- data/tests/test_hc.rb +155 -0
- data/tests/test_httpclient.rb +238 -0
- data/tests/test_httpclient2.rb +132 -0
- data/tests/test_idle_connection.rb +31 -0
- data/tests/test_inactivity_timeout.rb +102 -0
- data/tests/test_io_streamer.rb +47 -0
- data/tests/test_ipv4.rb +96 -0
- data/tests/test_ipv6.rb +107 -0
- data/tests/test_iterator.rb +122 -0
- data/tests/test_kb.rb +28 -0
- data/tests/test_keepalive.rb +113 -0
- data/tests/test_line_protocol.rb +33 -0
- data/tests/test_ltp.rb +155 -0
- data/tests/test_ltp2.rb +332 -0
- data/tests/test_many_fds.rb +21 -0
- data/tests/test_next_tick.rb +104 -0
- data/tests/test_object_protocol.rb +36 -0
- data/tests/test_pause.rb +109 -0
- data/tests/test_pending_connect_timeout.rb +52 -0
- data/tests/test_pool.rb +196 -0
- data/tests/test_process_watch.rb +50 -0
- data/tests/test_processes.rb +128 -0
- data/tests/test_proxy_connection.rb +180 -0
- data/tests/test_pure.rb +156 -0
- data/tests/test_queue.rb +64 -0
- data/tests/test_resolver.rb +129 -0
- data/tests/test_running.rb +14 -0
- data/tests/test_sasl.rb +46 -0
- data/tests/test_send_file.rb +217 -0
- data/tests/test_servers.rb +32 -0
- data/tests/test_shutdown_hooks.rb +23 -0
- data/tests/test_smtpclient.rb +75 -0
- data/tests/test_smtpserver.rb +90 -0
- data/tests/test_sock_opt.rb +53 -0
- data/tests/test_spawn.rb +290 -0
- data/tests/test_ssl_args.rb +41 -0
- data/tests/test_ssl_dhparam.rb +57 -0
- data/tests/test_ssl_ecdh_curve.rb +57 -0
- data/tests/test_ssl_extensions.rb +24 -0
- data/tests/test_ssl_methods.rb +31 -0
- data/tests/test_ssl_protocols.rb +190 -0
- data/tests/test_ssl_verify.rb +52 -0
- data/tests/test_stomp.rb +38 -0
- data/tests/test_system.rb +46 -0
- data/tests/test_threaded_resource.rb +68 -0
- data/tests/test_tick_loop.rb +58 -0
- data/tests/test_timers.rb +150 -0
- data/tests/test_ud.rb +8 -0
- data/tests/test_unbind_reason.rb +40 -0
- metadata +384 -0
data/tests/client.crt
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
-----BEGIN CERTIFICATE-----
|
|
2
|
+
MIIFRDCCAywCAQEwDQYJKoZIhvcNAQEFBQAwaDELMAkGA1UEBhMCRU0xFTATBgNV
|
|
3
|
+
BAgTDEV2ZW50TWFjaGluZTEVMBMGA1UEChMMRXZlbnRNYWNoaW5lMRQwEgYDVQQL
|
|
4
|
+
EwtEZXZlbG9wbWVudDEVMBMGA1UEAxMMRXZlbnRNYWNoaW5lMB4XDTA5MDMyOTAy
|
|
5
|
+
MzE0NloXDTEwMDMyOTAyMzE0NlowaDELMAkGA1UEBhMCRU0xFTATBgNVBAgTDEV2
|
|
6
|
+
ZW50TWFjaGluZTEVMBMGA1UEChMMRXZlbnRNYWNoaW5lMRQwEgYDVQQLEwtEZXZl
|
|
7
|
+
bG9wbWVudDEVMBMGA1UEAxMMRXZlbnRNYWNoaW5lMIICIjANBgkqhkiG9w0BAQEF
|
|
8
|
+
AAOCAg8AMIICCgKCAgEAv1FSOIX1z7CQtVBFlrB0A3/V29T+22STKKmiRWYkKL5b
|
|
9
|
+
+hkrp9IZ5J4phZHgUVM2VDPOO2Oc2PU6dlGGZISg+UPERunTogxQKezCV0vcE9cK
|
|
10
|
+
OwzxCFDRvv5rK8aKMscfBLbNKocAXywuRRQmdxPiVRzbyPrl+qCr/EDLXAX3D77l
|
|
11
|
+
S8n2AwDg19VyI+IgFUE+Dy5e1eLoY6nV+Mq+vNXdn3ttF3t+ngac5pj5Q9h+pD5p
|
|
12
|
+
67baDHSnf/7cy2fa/LKrLolVHQR9G2K6cEfeM99NtcsMbkoPs4iI3FA05OVTQHXg
|
|
13
|
+
C8C8cRxrb9APl95I/ep65OIaCJgcdYxJ3QD3qOtQo6/NQsGnjbyiUxaEpjfqyT1N
|
|
14
|
+
uzWD81Q8uXGNS8yD6dDynt/lseBjyp2nfC3uQ5fY18VdIcu0MJ9pezBUKrNuhlsy
|
|
15
|
+
XXEZ2DXj4sY8QOvIcBqSB/zmS1nGEK55xrtkaiaNrY8fe8wRVpcPLxy+P225NFw+
|
|
16
|
+
B69FJRA0Lj6Jt9BM4hV/3MSIEWwTVhuw4E02ywDYTzz1wq3ITf0tsbIPn0hXQMxD
|
|
17
|
+
ohhAoKioM6u+yHtqsxD0eYaAWmHTVn5oDvOSGpvCpBfWHyA7FP5UQak0fKABEAgK
|
|
18
|
+
iQYEnb294AXwXymJttfGTIV/Ne4tLN5dIpNma8UO8rlThlcr6xnTQDbR3gkTDRsC
|
|
19
|
+
AwEAATANBgkqhkiG9w0BAQUFAAOCAgEAj7J8fy1LUWoVWnrXDAC9jwJ1nI/YjoSU
|
|
20
|
+
6ywke3o04+nZC5S+dPnuVy+HAwsU940CoNvP6RStI/bH6JL+NIqEFmwM3M8xIEWV
|
|
21
|
+
MYVPkfvQUxxGvDnaY7vv93u+6Q77HV3qlhAQBHChyuXyO7TG3+WzsiT9AnBNtAP0
|
|
22
|
+
4jClt5kCAQXLO/p0SFEZQ8Ru9SM8d1i73Z0VDVzs8jYWlBhiherSgbw1xK4wBOpJ
|
|
23
|
+
43XmjZsBSrDpiAXd07Ak3UL2GjfT7eStgebL3UIe39ThE/s/+l43bh0M6WbOBvyQ
|
|
24
|
+
i/rZ50kd1GvN0xnZhtv07hIJWO85FGWi7Oet8AzdUZJ17v1Md/f2vdhPVTFN9q+w
|
|
25
|
+
mQ6LxjackqCvaJaQfBEbqsn2Tklxk4tZuDioiQbOElT2e6vljQVJWIfNx38Ny2LM
|
|
26
|
+
aiXQPQu+4CI7meAh5gXM5nyJGbZvRPsxj89CqYzyHCYs5HBP3AsviBvn26ziOF+c
|
|
27
|
+
544VmHd9HkIv8UTC29hh+R64RlgMQQQdaXFaUrFPTs/do0k8n/c2bPc0iTdfi5Q2
|
|
28
|
+
gq6Vi8q6Ay5wGgTtRRbn/mWKuCFjEh94z6pF9Xr06NX0PuEOdf+Ls9vI5vz6G0w6
|
|
29
|
+
0Li7devEN7EKBY+7Mcjg918yq9i5tEiMkUgT68788t3fTC+4iUQ5fDtdrHsaOlIR
|
|
30
|
+
8bs/XQVNE/s=
|
|
31
|
+
-----END CERTIFICATE-----
|
data/tests/client.key
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
-----BEGIN RSA PRIVATE KEY-----
|
|
2
|
+
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
|
|
51
|
+
-----END RSA PRIVATE KEY-----
|
data/tests/dhparam.pem
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
-----BEGIN DH PARAMETERS-----
|
|
2
|
+
MIICCAKCAgEAikiatXa5aAteOtd6hOO33npjCvJByD3dwuM8rWzz0DFZdUH9nFJi
|
|
3
|
+
b0VvTVweVECb6XZBsrDNLqGQykCrm43swSk5D9XQCGJLxFERD6yk3b90xaeCm3/a
|
|
4
|
+
b0Ek5ZVvV73Cc/YbVmpBiOHoTFpUFJLZ7pLMQUSn8y3qUlNcY9/88HuwFi1s1lRM
|
|
5
|
+
ovihSRyZMYAuYWOD4yuOuIcroKVjD6gWFrsW9XrALWny6vUXQrhk8Q3rj+wM6ZtE
|
|
6
|
+
5afcB0b6ZJtphrDfk3dFjOVG/zVT37VWgrY8GABrpo2ey0W0WIQJ7rDKLaPaI4kc
|
|
7
|
+
voOgC2K8Z3kSARZK+jULnwmBeYECz4EH/FF6FEp3GOKtkL4mqEkvh1n5EAesDOGl
|
|
8
|
+
iiX+RZXcUrZliSeifSXBTMJWWFVC0fkGIMb9PTZfZHyAC54lpuxzVki0HIyQG9Fs
|
|
9
|
+
41zBJ5e8eEoXXlfUYtduUC35YGy2IxSzYLAJE76rctAZSWghha9xLOCDFoLjMr8h
|
|
10
|
+
FosKeHKJcBQ0bc8ymOpRIfrYLWhc0Pz2zkpJ/4eYw9t7NYg7S+jP19IE0gUnuM9v
|
|
11
|
+
SpoYMtS28tP9nEdokdwuBKD0D3bJEBBefDlHgfXoMgvy9Hivc9PBGGNTNpyFPpwF
|
|
12
|
+
sWVAkfhoNMJMC5V7LZsze+lftiDtzVoLSPDa9bO4BK7b/MgwCxfOhGsCAQI=
|
|
13
|
+
-----END DH PARAMETERS-----
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
##
|
|
4
|
+
# EMSSLHandlers has two classes, `Client` and `Server`, and one method,
|
|
5
|
+
# `client_server`, which is a wrapper around
|
|
6
|
+
#
|
|
7
|
+
# EM.run do
|
|
8
|
+
# EM.start_server IP, PORT, s_hndlr, server
|
|
9
|
+
# EM.connect IP, PORT, c_hndlr, client
|
|
10
|
+
# end
|
|
11
|
+
#
|
|
12
|
+
# It also passes parameters to the `start_tls` call within the `post_init`
|
|
13
|
+
# callbacks of Client and Server.
|
|
14
|
+
#
|
|
15
|
+
# Client and Server have most standard callbacks and many 'get_*' function values
|
|
16
|
+
# as attributes.
|
|
17
|
+
#
|
|
18
|
+
# `Client` has a `:client_unbind` parameter, which when set to true, calls
|
|
19
|
+
# `EM.stop_event_loop` in the `unbind` callback.
|
|
20
|
+
#
|
|
21
|
+
# `Server` has two additional parameters.
|
|
22
|
+
#
|
|
23
|
+
# `:ssl_verify_result`, which is normally set to true/false for the
|
|
24
|
+
# `ssl_verify_peer` return value. If it is set to a String starting with "|RAISE|",
|
|
25
|
+
# the remaing string will be raised.
|
|
26
|
+
#
|
|
27
|
+
# `:stop_after_handshake`, when set to true, will close the connection and then
|
|
28
|
+
# call `EM.stop_event_loop`.
|
|
29
|
+
#
|
|
30
|
+
module EMSSLHandlers
|
|
31
|
+
|
|
32
|
+
IP, PORT = "127.0.0.1", 16784
|
|
33
|
+
|
|
34
|
+
# is OpenSSL version >= 1.1.0
|
|
35
|
+
IS_SSL_GE_1_1 = (EM::OPENSSL_LIBRARY_VERSION[/OpenSSL (\d+\.\d+\.\d+)/, 1]
|
|
36
|
+
.split('.').map(&:to_i) <=> [1,1]) == 1
|
|
37
|
+
|
|
38
|
+
# common start_tls parameters
|
|
39
|
+
SSL_3 = { ssl_version: %w(SSLv3) }
|
|
40
|
+
TLS_1_2 = { ssl_version: %w(TLSv1_2) }
|
|
41
|
+
TLS_1_3 = { ssl_version: %w(TLSv1_3) }
|
|
42
|
+
TLS_ALL = { ssl_version: Test::Unit::TestCase::SSL_AVAIL }
|
|
43
|
+
|
|
44
|
+
module Client
|
|
45
|
+
def initialize(tls = nil)
|
|
46
|
+
@@tls = tls ? tls.dup : tls
|
|
47
|
+
@@handshake_completed = false
|
|
48
|
+
@@cert_value = nil
|
|
49
|
+
@@cipher_bits = nil
|
|
50
|
+
@@cipher_name = nil
|
|
51
|
+
@@cipher_protocol = nil
|
|
52
|
+
@@client_unbind = @@tls ? @@tls.delete(:client_unbind) : nil
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def self.cert_value ; @@cert_value end
|
|
56
|
+
def self.cipher_bits ; @@cipher_bits end
|
|
57
|
+
def self.cipher_name ; @@cipher_name end
|
|
58
|
+
def self.cipher_protocol ; @@cipher_protocol end
|
|
59
|
+
def self.handshake_completed? ; !!@@handshake_completed end
|
|
60
|
+
|
|
61
|
+
def post_init
|
|
62
|
+
if @@tls
|
|
63
|
+
start_tls @@tls
|
|
64
|
+
else
|
|
65
|
+
start_tls
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def ssl_handshake_completed
|
|
70
|
+
@@handshake_completed = true
|
|
71
|
+
@@cert_value = get_peer_cert
|
|
72
|
+
@@cipher_bits = get_cipher_bits
|
|
73
|
+
@@cipher_name = get_cipher_name
|
|
74
|
+
@@cipher_protocol = get_cipher_protocol
|
|
75
|
+
|
|
76
|
+
if "TLSv1.3" != @@cipher_protocol
|
|
77
|
+
close_connection
|
|
78
|
+
EM.stop_event_loop
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def unbind
|
|
83
|
+
EM.stop_event_loop if @@client_unbind
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
module Server
|
|
88
|
+
def initialize(tls = nil)
|
|
89
|
+
@@tls = tls ? tls.dup : tls
|
|
90
|
+
@@handshake_completed = false
|
|
91
|
+
@@cert_value = nil
|
|
92
|
+
@@cipher_bits = nil
|
|
93
|
+
@@cipher_name = nil
|
|
94
|
+
@@cipher_protocol = nil
|
|
95
|
+
@@sni_hostname = "not set"
|
|
96
|
+
@@ssl_verify_result = @@tls ? @@tls.delete(:ssl_verify_result) : nil
|
|
97
|
+
@@stop_after_handshake = @@tls ? @@tls.delete(:stop_after_handshake) : nil
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
def self.cert ; @@cert end
|
|
101
|
+
def self.cert_value ; @@cert_value end
|
|
102
|
+
def self.cipher_bits ; @@cipher_bits end
|
|
103
|
+
def self.cipher_name ; @@cipher_name end
|
|
104
|
+
def self.cipher_protocol ; @@cipher_protocol end
|
|
105
|
+
def self.handshake_completed? ; !!@@handshake_completed end
|
|
106
|
+
def self.sni_hostname ; @@sni_hostname end
|
|
107
|
+
|
|
108
|
+
def post_init
|
|
109
|
+
if @@tls
|
|
110
|
+
start_tls @@tls
|
|
111
|
+
else
|
|
112
|
+
start_tls
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
def ssl_verify_peer(cert)
|
|
117
|
+
@@cert = cert
|
|
118
|
+
if @@ssl_verify_result.is_a?(String) && @@ssl_verify_result.start_with?("|RAISE|")
|
|
119
|
+
raise @@ssl_verify_result.sub('|RAISE|', '')
|
|
120
|
+
else
|
|
121
|
+
@@ssl_verify_result
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
def ssl_handshake_completed
|
|
126
|
+
@@handshake_completed = true
|
|
127
|
+
@@cert_value = get_peer_cert
|
|
128
|
+
@@cipher_bits = get_cipher_bits
|
|
129
|
+
@@cipher_name = get_cipher_name
|
|
130
|
+
@@cipher_protocol = get_cipher_protocol
|
|
131
|
+
|
|
132
|
+
@@sni_hostname = get_sni_hostname
|
|
133
|
+
if ("TLSv1.3" == @@cipher_protocol) || @@stop_after_handshake
|
|
134
|
+
close_connection
|
|
135
|
+
EM.stop_event_loop
|
|
136
|
+
end
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
def unbind
|
|
140
|
+
EM.stop_event_loop unless @@handshake_completed
|
|
141
|
+
end
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
def client_server(c_hndlr = Client, s_hndlr = Server,
|
|
145
|
+
client: nil, server: nil, timeout: 3.0)
|
|
146
|
+
EM.run do
|
|
147
|
+
# fail safe stop
|
|
148
|
+
setup_timeout timeout
|
|
149
|
+
EM.start_server IP, PORT, s_hndlr, server
|
|
150
|
+
EM.connect IP, PORT, c_hndlr, client
|
|
151
|
+
end
|
|
152
|
+
end
|
|
153
|
+
end if EM.ssl?
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
require 'em/pure_ruby' if ENV['EM_PURE_RUBY']
|
|
2
|
+
require 'eventmachine'
|
|
3
|
+
require 'rbconfig'
|
|
4
|
+
require 'socket'
|
|
5
|
+
|
|
6
|
+
# verbose fun is to stop warnings when loading test-unit 3.2.9 in trunk
|
|
7
|
+
verbose, $VERBOSE = $VERBOSE, nil
|
|
8
|
+
require 'test/unit'
|
|
9
|
+
$VERBOSE = verbose
|
|
10
|
+
|
|
11
|
+
class Test::Unit::TestCase
|
|
12
|
+
|
|
13
|
+
# below outputs to console on load
|
|
14
|
+
# SSL_AVAIL is used by SSL tests
|
|
15
|
+
puts "", RUBY_DESCRIPTION
|
|
16
|
+
puts "\nEM.library_type #{EM.library_type.to_s.ljust(16)} EM.ssl? #{EM.ssl?}"
|
|
17
|
+
if EM.ssl?
|
|
18
|
+
require 'openssl'
|
|
19
|
+
ssl_lib_vers = OpenSSL.const_defined?(:OPENSSL_LIBRARY_VERSION) ?
|
|
20
|
+
OpenSSL::OPENSSL_LIBRARY_VERSION : 'na'
|
|
21
|
+
puts "OpenSSL OPENSSL_LIBRARY_VERSION: #{ssl_lib_vers}\n" \
|
|
22
|
+
" OPENSSL_VERSION: #{OpenSSL::OPENSSL_VERSION}\n" \
|
|
23
|
+
" EM OPENSSL_LIBRARY_VERSION: #{EM::OPENSSL_LIBRARY_VERSION}\n" \
|
|
24
|
+
" OPENSSL_VERSION: #{EM::OPENSSL_VERSION}"
|
|
25
|
+
|
|
26
|
+
# assumes all 2.x versions include support for TLSv1_2
|
|
27
|
+
temp = []
|
|
28
|
+
temp << 'SSLv2' unless EM::OPENSSL_NO_SSL2
|
|
29
|
+
temp << 'SSLv3' unless EM::OPENSSL_NO_SSL3
|
|
30
|
+
temp += %w[TLSv1 TLSv1_1 TLSv1_2]
|
|
31
|
+
temp << 'TLSv1_3' if EM.const_defined? :EM_PROTO_TLSv1_3
|
|
32
|
+
temp.sort!
|
|
33
|
+
puts " SSL_AVAIL: #{temp.join(' ')}", ""
|
|
34
|
+
SSL_AVAIL = temp.freeze
|
|
35
|
+
else
|
|
36
|
+
puts "\nEventMachine is not built with OpenSSL support, skipping tests in",
|
|
37
|
+
"files tests/test_ssl_*.rb"
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
class EMTestTimeout < StandardError ; end
|
|
41
|
+
|
|
42
|
+
def setup_timeout(timeout = TIMEOUT_INTERVAL)
|
|
43
|
+
EM.schedule {
|
|
44
|
+
EM.add_timer(timeout) {
|
|
45
|
+
raise EMTestTimeout, "Test was cancelled after #{timeout} seconds."
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def port_in_use?(port, host="127.0.0.1")
|
|
51
|
+
s = TCPSocket.new(host, port)
|
|
52
|
+
s.close
|
|
53
|
+
s
|
|
54
|
+
rescue Errno::ECONNREFUSED
|
|
55
|
+
false
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def next_port
|
|
59
|
+
@@port ||= 9000
|
|
60
|
+
begin
|
|
61
|
+
@@port += 1
|
|
62
|
+
end while port_in_use?(@@port)
|
|
63
|
+
|
|
64
|
+
@@port
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# Returns true if the host have a localhost 127.0.0.1 IPv4.
|
|
68
|
+
def self.local_ipv4?
|
|
69
|
+
return @@has_local_ipv4 if defined?(@@has_local_ipv4)
|
|
70
|
+
begin
|
|
71
|
+
get_my_ipv4_address "127.0.0.1"
|
|
72
|
+
@@has_local_ipv4 = true
|
|
73
|
+
rescue
|
|
74
|
+
@@has_local_ipv4 = false
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
# Returns true if the host have a public IPv4 and stores it in
|
|
79
|
+
# @@public_ipv4.
|
|
80
|
+
def self.public_ipv4?
|
|
81
|
+
return @@has_public_ipv4 if defined?(@@has_public_ipv4)
|
|
82
|
+
begin
|
|
83
|
+
@@public_ipv4 = get_my_ipv4_address "1.2.3.4"
|
|
84
|
+
@@has_public_ipv4 = true
|
|
85
|
+
rescue
|
|
86
|
+
@@has_public_ipv4 = false
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
# Returns true if the host have a localhost ::1 IPv6.
|
|
91
|
+
def self.local_ipv6?
|
|
92
|
+
return @@has_local_ipv6 if defined?(@@has_local_ipv6)
|
|
93
|
+
begin
|
|
94
|
+
get_my_ipv6_address "::1"
|
|
95
|
+
@@has_local_ipv6 = true
|
|
96
|
+
rescue
|
|
97
|
+
@@has_local_ipv6 = false
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
# Returns true if the host have a public IPv6 and stores it in
|
|
102
|
+
# @@public_ipv6.
|
|
103
|
+
def self.public_ipv6?
|
|
104
|
+
return @@has_public_ipv6 if defined?(@@has_public_ipv6)
|
|
105
|
+
begin
|
|
106
|
+
@@public_ipv6 = get_my_ipv6_address "2001::1"
|
|
107
|
+
@@has_public_ipv6 = true
|
|
108
|
+
rescue
|
|
109
|
+
@@has_public_ipv6 = false
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
# Returns an array with the localhost addresses (IPv4 and/or IPv6).
|
|
114
|
+
def local_ips
|
|
115
|
+
return @@local_ips if defined?(@@local_ips)
|
|
116
|
+
@@local_ips = []
|
|
117
|
+
@@local_ips << "127.0.0.1" if self.class.local_ipv4?
|
|
118
|
+
@@local_ips << "::1" if self.class.local_ipv6?
|
|
119
|
+
@@local_ips
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
def exception_class
|
|
123
|
+
jruby? ? NativeException : RuntimeError
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
module PlatformHelper
|
|
127
|
+
# http://blog.emptyway.com/2009/11/03/proper-way-to-detect-windows-platform-in-ruby/
|
|
128
|
+
def windows?
|
|
129
|
+
RbConfig::CONFIG['host_os'] =~ /mswin|mingw/
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
def darwin?
|
|
133
|
+
RUBY_PLATFORM =~ /darwin/
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
def solaris?
|
|
137
|
+
RUBY_PLATFORM =~ /solaris/
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
# http://stackoverflow.com/questions/1342535/how-can-i-tell-if-im-running-from-jruby-vs-ruby/1685970#1685970
|
|
141
|
+
def jruby?
|
|
142
|
+
defined? JRUBY_VERSION
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
def rbx?
|
|
146
|
+
defined?(RUBY_ENGINE) && RUBY_ENGINE == 'rbx'
|
|
147
|
+
end
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
include PlatformHelper
|
|
151
|
+
extend PlatformHelper
|
|
152
|
+
|
|
153
|
+
# Tests may run slower on windows or Appveyor. YMMV
|
|
154
|
+
TIMEOUT_INTERVAL = windows? ? 0.25 : 0.25
|
|
155
|
+
|
|
156
|
+
module EMTestCasePrepend
|
|
157
|
+
def setup
|
|
158
|
+
EM.stop while EM.reactor_running?
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
def teardown
|
|
162
|
+
EM.cleanup_machine
|
|
163
|
+
end
|
|
164
|
+
end
|
|
165
|
+
prepend EMTestCasePrepend
|
|
166
|
+
|
|
167
|
+
def silent
|
|
168
|
+
backup, $VERBOSE = $VERBOSE, nil
|
|
169
|
+
begin
|
|
170
|
+
yield
|
|
171
|
+
ensure
|
|
172
|
+
$VERBOSE = backup
|
|
173
|
+
end
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
private
|
|
178
|
+
|
|
179
|
+
def self.get_my_ipv4_address ip
|
|
180
|
+
orig, Socket.do_not_reverse_lookup = Socket.do_not_reverse_lookup, true # turn off reverse DNS resolution temporarily
|
|
181
|
+
UDPSocket.open(Socket::AF_INET) do |s|
|
|
182
|
+
s.connect ip, 1
|
|
183
|
+
s.addr.last
|
|
184
|
+
end
|
|
185
|
+
ensure
|
|
186
|
+
Socket.do_not_reverse_lookup = orig
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
def self.get_my_ipv6_address ip
|
|
190
|
+
orig, Socket.do_not_reverse_lookup = Socket.do_not_reverse_lookup, true # turn off reverse DNS resolution temporarily
|
|
191
|
+
UDPSocket.open(Socket::AF_INET6) do |s|
|
|
192
|
+
s.connect ip, 1
|
|
193
|
+
s.addr.last
|
|
194
|
+
end
|
|
195
|
+
ensure
|
|
196
|
+
Socket.do_not_reverse_lookup = orig
|
|
197
|
+
end
|
|
198
|
+
end
|