eventmachine 0.12.10-x86-mswin32-60 → 1.0.0.beta.2-x86-mswin32-60

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 (150) hide show
  1. data/.gitignore +2 -0
  2. data/Gemfile +1 -0
  3. data/README +80 -81
  4. data/Rakefile +7 -370
  5. data/docs/COPYING +60 -60
  6. data/docs/ChangeLog +211 -211
  7. data/docs/DEFERRABLES +246 -133
  8. data/docs/EPOLL +141 -141
  9. data/docs/GNU +281 -281
  10. data/docs/INSTALL +13 -13
  11. data/docs/KEYBOARD +42 -38
  12. data/docs/LEGAL +25 -25
  13. data/docs/LIGHTWEIGHT_CONCURRENCY +130 -70
  14. data/docs/PURE_RUBY +75 -75
  15. data/docs/RELEASE_NOTES +94 -94
  16. data/docs/SMTP +4 -2
  17. data/docs/SPAWNED_PROCESSES +148 -89
  18. data/docs/TODO +8 -8
  19. data/eventmachine.gemspec +19 -26
  20. data/examples/ex_channel.rb +42 -42
  21. data/examples/ex_queue.rb +2 -2
  22. data/examples/ex_tick_loop_array.rb +15 -0
  23. data/examples/ex_tick_loop_counter.rb +32 -0
  24. data/examples/helper.rb +1 -1
  25. data/ext/binder.cpp +0 -1
  26. data/ext/cmain.cpp +36 -25
  27. data/ext/ed.cpp +104 -113
  28. data/ext/ed.h +24 -30
  29. data/ext/em.cpp +349 -283
  30. data/ext/em.h +25 -29
  31. data/ext/eventmachine.h +5 -4
  32. data/ext/extconf.rb +58 -49
  33. data/ext/fastfilereader/extconf.rb +5 -3
  34. data/ext/fastfilereader/mapper.cpp +214 -214
  35. data/ext/fastfilereader/mapper.h +59 -59
  36. data/ext/fastfilereader/rubymain.cpp +127 -127
  37. data/ext/kb.cpp +1 -3
  38. data/ext/page.cpp +107 -107
  39. data/ext/page.h +51 -51
  40. data/ext/pipe.cpp +9 -11
  41. data/ext/project.h +12 -8
  42. data/ext/rubymain.cpp +138 -104
  43. data/java/.classpath +8 -8
  44. data/java/.project +17 -17
  45. data/java/src/com/rubyeventmachine/EmReactor.java +1 -0
  46. data/java/src/com/rubyeventmachine/EmReactorException.java +40 -40
  47. data/lib/em/buftok.rb +138 -138
  48. data/lib/em/callback.rb +25 -25
  49. data/lib/em/channel.rb +1 -1
  50. data/lib/em/connection.rb +6 -1
  51. data/lib/em/deferrable.rb +16 -2
  52. data/lib/em/file_watch.rb +53 -53
  53. data/lib/em/future.rb +61 -61
  54. data/lib/em/iterator.rb +270 -0
  55. data/lib/em/messages.rb +66 -66
  56. data/lib/em/process_watch.rb +43 -43
  57. data/lib/em/protocols.rb +1 -1
  58. data/lib/em/protocols/header_and_content.rb +138 -138
  59. data/lib/em/protocols/httpclient.rb +267 -262
  60. data/lib/em/protocols/line_protocol.rb +28 -0
  61. data/lib/em/protocols/memcache.rb +322 -322
  62. data/lib/em/protocols/postgres3.rb +247 -247
  63. data/lib/em/protocols/saslauth.rb +175 -175
  64. data/lib/em/protocols/smtpserver.rb +640 -547
  65. data/lib/em/protocols/stomp.rb +200 -200
  66. data/lib/em/protocols/tcptest.rb +52 -52
  67. data/lib/{pr_eventmachine.rb → em/pure_ruby.rb} +1013 -1022
  68. data/lib/em/queue.rb +1 -0
  69. data/lib/em/spawnable.rb +85 -85
  70. data/lib/em/streamer.rb +130 -130
  71. data/lib/em/tick_loop.rb +85 -0
  72. data/lib/em/timers.rb +2 -1
  73. data/lib/em/version.rb +1 -1
  74. data/lib/eventmachine.rb +40 -84
  75. data/lib/jeventmachine.rb +2 -1
  76. data/lib/rubyeventmachine.rb +2 -0
  77. data/setup.rb +1585 -1585
  78. data/tasks/doc.rake +30 -0
  79. data/tasks/package.rake +85 -0
  80. data/tasks/test.rake +6 -0
  81. data/tests/client.crt +31 -31
  82. data/tests/client.key +51 -51
  83. data/tests/test_attach.rb +13 -3
  84. data/tests/test_basic.rb +60 -95
  85. data/tests/test_channel.rb +3 -2
  86. data/tests/test_defer.rb +49 -47
  87. data/tests/test_deferrable.rb +35 -0
  88. data/tests/test_error_handler.rb +35 -35
  89. data/tests/test_errors.rb +82 -82
  90. data/tests/test_exc.rb +55 -55
  91. data/tests/test_file_watch.rb +49 -49
  92. data/tests/test_futures.rb +198 -198
  93. data/tests/test_handler_check.rb +36 -36
  94. data/tests/test_hc.rb +190 -218
  95. data/tests/test_httpclient.rb +227 -218
  96. data/tests/test_httpclient2.rb +3 -2
  97. data/tests/test_inactivity_timeout.rb +3 -3
  98. data/tests/test_kb.rb +60 -60
  99. data/tests/test_ltp.rb +13 -5
  100. data/tests/test_ltp2.rb +317 -317
  101. data/tests/test_next_tick.rb +1 -1
  102. data/tests/test_object_protocol.rb +36 -36
  103. data/tests/test_pending_connect_timeout.rb +2 -2
  104. data/tests/test_process_watch.rb +50 -48
  105. data/tests/test_proxy_connection.rb +52 -0
  106. data/tests/test_pure.rb +134 -125
  107. data/tests/test_queue.rb +44 -44
  108. data/tests/test_running.rb +42 -42
  109. data/tests/test_sasl.rb +72 -72
  110. data/tests/test_send_file.rb +251 -242
  111. data/tests/test_servers.rb +76 -76
  112. data/tests/test_smtpclient.rb +83 -83
  113. data/tests/test_smtpserver.rb +85 -85
  114. data/tests/test_spawn.rb +322 -322
  115. data/tests/test_ssl_methods.rb +49 -49
  116. data/tests/test_ssl_verify.rb +82 -82
  117. data/tests/test_tick_loop.rb +59 -0
  118. data/tests/test_timers.rb +13 -15
  119. data/tests/test_ud.rb +36 -36
  120. data/tests/testem.rb +31 -31
  121. metadata +66 -51
  122. data/ext/cplusplus.cpp +0 -202
  123. data/ext/emwin.cpp +0 -300
  124. data/ext/emwin.h +0 -94
  125. data/ext/epoll.cpp +0 -26
  126. data/ext/epoll.h +0 -25
  127. data/ext/eventmachine_cpp.h +0 -96
  128. data/ext/files.cpp +0 -94
  129. data/ext/files.h +0 -65
  130. data/ext/sigs.cpp +0 -89
  131. data/ext/sigs.h +0 -32
  132. data/java/src/com/rubyeventmachine/application/Application.java +0 -194
  133. data/java/src/com/rubyeventmachine/application/Connection.java +0 -74
  134. data/java/src/com/rubyeventmachine/application/ConnectionFactory.java +0 -37
  135. data/java/src/com/rubyeventmachine/application/DefaultConnectionFactory.java +0 -46
  136. data/java/src/com/rubyeventmachine/application/PeriodicTimer.java +0 -38
  137. data/java/src/com/rubyeventmachine/application/Timer.java +0 -54
  138. data/java/src/com/rubyeventmachine/tests/ApplicationTest.java +0 -109
  139. data/java/src/com/rubyeventmachine/tests/ConnectTest.java +0 -148
  140. data/java/src/com/rubyeventmachine/tests/EMTest.java +0 -80
  141. data/java/src/com/rubyeventmachine/tests/TestDatagrams.java +0 -53
  142. data/java/src/com/rubyeventmachine/tests/TestServers.java +0 -75
  143. data/java/src/com/rubyeventmachine/tests/TestTimers.java +0 -90
  144. data/lib/evma.rb +0 -32
  145. data/lib/evma/callback.rb +0 -32
  146. data/lib/evma/container.rb +0 -75
  147. data/lib/evma/factory.rb +0 -77
  148. data/lib/evma/protocol.rb +0 -87
  149. data/lib/evma/reactor.rb +0 -48
  150. data/web/whatis +0 -7
@@ -1,37 +1,37 @@
1
- $:.unshift "../lib"
2
- require 'eventmachine'
3
- require 'test/unit'
4
-
5
- class TestHandlerCheck < Test::Unit::TestCase
6
-
7
- class Foo < EM::Connection; end;
8
- module TestModule; end;
9
-
10
- def test_with_correct_class
11
- assert_nothing_raised do
12
- EM.run {
13
- EM.connect("127.0.0.1", 80, Foo)
14
- EM.stop_event_loop
15
- }
16
- end
17
- end
18
-
19
- def test_with_incorrect_class
20
- assert_raise(ArgumentError) do
21
- EM.run {
22
- EM.connect("127.0.0.1", 80, String)
23
- EM.stop_event_loop
24
- }
25
- end
26
- end
27
-
28
- def test_with_module
29
- assert_nothing_raised do
30
- EM.run {
31
- EM.connect("127.0.0.1", 80, TestModule)
32
- EM.stop_event_loop
33
- }
34
- end
35
- end
36
-
1
+ $:.unshift "../lib"
2
+ require 'eventmachine'
3
+ require 'test/unit'
4
+
5
+ class TestHandlerCheck < Test::Unit::TestCase
6
+
7
+ class Foo < EM::Connection; end;
8
+ module TestModule; end;
9
+
10
+ def test_with_correct_class
11
+ assert_nothing_raised do
12
+ EM.run {
13
+ EM.connect("127.0.0.1", 80, Foo)
14
+ EM.stop_event_loop
15
+ }
16
+ end
17
+ end
18
+
19
+ def test_with_incorrect_class
20
+ assert_raise(ArgumentError) do
21
+ EM.run {
22
+ EM.connect("127.0.0.1", 80, String)
23
+ EM.stop_event_loop
24
+ }
25
+ end
26
+ end
27
+
28
+ def test_with_module
29
+ assert_nothing_raised do
30
+ EM.run {
31
+ EM.connect("127.0.0.1", 80, TestModule)
32
+ EM.stop_event_loop
33
+ }
34
+ end
35
+ end
36
+
37
37
  end
@@ -1,218 +1,190 @@
1
- # $Id$
2
- #
3
- # Author:: Francis Cianfrocca (gmail: blackhedd)
4
- # Homepage:: http://rubyeventmachine.com
5
- # Date:: 8 April 2006
6
- #
7
- # See EventMachine and EventMachine::Connection for documentation and
8
- # usage examples.
9
- #
10
- #----------------------------------------------------------------------------
11
- #
12
- # Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved.
13
- # Gmail: blackhedd
14
- #
15
- # This program is free software; you can redistribute it and/or modify
16
- # it under the terms of either: 1) the GNU General Public License
17
- # as published by the Free Software Foundation; either version 2 of the
18
- # License, or (at your option) any later version; or 2) Ruby's License.
19
- #
20
- # See the file COPYING for complete licensing information.
21
- #
22
- #---------------------------------------------------------------------------
23
- #
24
- #
25
- #
26
-
27
- # $:.unshift "../lib"
28
- require 'eventmachine'
29
- require 'test/unit'
30
-
31
- class TestHeaderAndContentProtocol < Test::Unit::TestCase
32
-
33
- TestHost = "127.0.0.1"
34
- TestPort = 8905
35
-
36
- class SimpleTest < EventMachine::Protocols::HeaderAndContentProtocol
37
- attr_reader :first_header, :my_headers, :request
38
-
39
- def receive_first_header_line hdr
40
- @first_header ||= []
41
- @first_header << hdr
42
- end
43
- def receive_headers hdrs
44
- @my_headers ||= []
45
- @my_headers << hdrs
46
- end
47
- def receive_request hdrs, content
48
- @request ||= []
49
- @request << [hdrs, content]
50
- end
51
- end
52
-
53
- def test_no_content
54
- the_connection = nil
55
- EventMachine.run {
56
- EventMachine.start_server( TestHost, TestPort, SimpleTest ) do |conn|
57
- the_connection = conn
58
- end
59
- EventMachine.add_timer(4) {raise "test timed out"}
60
-
61
- client = Module.new do
62
- def unbind
63
- EM.add_timer(0.1) { EM.stop }
64
- end
65
-
66
- def post_init
67
- send_data [ "aaa\n", "bbb\r\n", "ccc\n", "\n" ].join
68
- close_connection_after_writing
69
- end
70
- end
71
-
72
- EventMachine.connect( TestHost, TestPort, client )
73
- }
74
- assert_equal( ["aaa"], the_connection.first_header )
75
- assert_equal( [%w(aaa bbb ccc)], the_connection.my_headers )
76
- assert_equal( [[%w(aaa bbb ccc), ""]], the_connection.request )
77
- end
78
-
79
- def test_content
80
- the_connection = nil
81
- content = "A" * 50
82
- headers = ["aaa", "bbb", "Content-length: #{content.length}", "ccc"]
83
- EventMachine.run {
84
- EventMachine.start_server( TestHost, TestPort, SimpleTest ) do |conn|
85
- the_connection = conn
86
- end
87
- EventMachine.add_timer(4) { assert(false, 'test timeout'); EM.stop }
88
-
89
- client = Module.new do
90
- define_method(:headers) { headers }
91
- define_method(:content) { content }
92
-
93
- def unbind
94
- EM.add_timer(0.1) { EM.stop }
95
- end
96
-
97
- def post_init
98
- headers.each { |h| send_data "#{h}\r\n" }
99
- send_data "\n"
100
- send_data content
101
- close_connection_after_writing
102
- end
103
- end
104
-
105
- EventMachine.connect( TestHost, TestPort, client )
106
-
107
- }
108
- assert_equal( ["aaa"], the_connection.first_header )
109
- assert_equal( [headers], the_connection.my_headers )
110
- assert_equal( [[headers, content]], the_connection.request )
111
- end
112
-
113
- def test_several_requests
114
- the_connection = nil
115
- content = "A" * 50
116
- headers = ["aaa", "bbb", "Content-length: #{content.length}", "ccc"]
117
- EventMachine.run {
118
- EventMachine.start_server( TestHost, TestPort, SimpleTest ) do |conn|
119
- the_connection = conn
120
- end
121
- EventMachine.add_timer(4) { assert(false, 'test timeout'); EM.stop }
122
-
123
- client = Module.new do
124
- define_method(:headers) { headers }
125
- define_method(:content) { content }
126
-
127
- def unbind
128
- EM.add_timer(0.1) { EM.stop }
129
- end
130
-
131
- def post_init
132
- 5.times do
133
- headers.each { |h| send_data "#{h}\r\n" }
134
- send_data "\n"
135
- send_data content
136
- end
137
- close_connection_after_writing
138
- end
139
- end
140
-
141
- EventMachine.connect( TestHost, TestPort, client )
142
- }
143
- assert_equal( ["aaa"] * 5, the_connection.first_header )
144
- assert_equal( [headers] * 5, the_connection.my_headers )
145
- assert_equal( [[headers, content]] * 5, the_connection.request )
146
- end
147
-
148
-
149
- # def x_test_multiple_content_length_headers
150
- # # This is supposed to throw a RuntimeError but it throws a C++ exception instead.
151
- # the_connection = nil
152
- # content = "A" * 50
153
- # headers = ["aaa", "bbb", ["Content-length: #{content.length}"]*2, "ccc"].flatten
154
- # EventMachine.run {
155
- # EventMachine.start_server( TestHost, TestPort, SimpleTest ) do |conn|
156
- # the_connection = conn
157
- # end
158
- # EventMachine.add_timer(4) {raise "test timed out"}
159
- # test_proc = proc {
160
- # t = TCPSocket.new TestHost, TestPort
161
- # headers.each {|h| t.write "#{h}\r\n" }
162
- # t.write "\n"
163
- # t.write content
164
- # t.close
165
- # }
166
- # EventMachine.defer test_proc, proc {
167
- # EventMachine.stop
168
- # }
169
- # }
170
- # end
171
-
172
- def test_interpret_headers
173
- the_connection = nil
174
- content = "A" * 50
175
- headers = [
176
- "GET / HTTP/1.0",
177
- "Accept: aaa",
178
- "User-Agent: bbb",
179
- "Host: ccc",
180
- "x-tempest-header:ddd"
181
- ]
182
-
183
- EventMachine.run {
184
- EventMachine.start_server( TestHost, TestPort, SimpleTest ) do |conn|
185
- the_connection = conn
186
- end
187
- EventMachine.add_timer(4) {raise "test timed out"}
188
-
189
- client = Module.new do
190
- define_method(:headers) { headers }
191
- define_method(:content) { content }
192
-
193
- def unbind
194
- EM.add_timer(0.1) { EM.stop }
195
- end
196
-
197
- def post_init
198
- headers.each { |h| send_data "#{h}\r\n" }
199
- send_data "\n"
200
- send_data content
201
- close_connection_after_writing
202
- end
203
- end
204
-
205
- EventMachine.connect( TestHost, TestPort, client )
206
- }
207
-
208
- hsh = the_connection.headers_2_hash( the_connection.my_headers.shift )
209
- expect = {
210
- :accept => "aaa",
211
- :user_agent => "bbb",
212
- :host => "ccc",
213
- :x_tempest_header => "ddd"
214
- }
215
- assert_equal(expect, hsh)
216
- end
217
-
218
- end
1
+ # $Id$
2
+ #
3
+ # Author:: Francis Cianfrocca (gmail: blackhedd)
4
+ # Homepage:: http://rubyeventmachine.com
5
+ # Date:: 8 April 2006
6
+ #
7
+ # See EventMachine and EventMachine::Connection for documentation and
8
+ # usage examples.
9
+ #
10
+ #----------------------------------------------------------------------------
11
+ #
12
+ # Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved.
13
+ # Gmail: blackhedd
14
+ #
15
+ # This program is free software; you can redistribute it and/or modify
16
+ # it under the terms of either: 1) the GNU General Public License
17
+ # as published by the Free Software Foundation; either version 2 of the
18
+ # License, or (at your option) any later version; or 2) Ruby's License.
19
+ #
20
+ # See the file COPYING for complete licensing information.
21
+ #
22
+ #---------------------------------------------------------------------------
23
+ #
24
+ #
25
+ #
26
+
27
+ require 'eventmachine'
28
+ require 'test/unit'
29
+
30
+ class TestHeaderAndContentProtocol < Test::Unit::TestCase
31
+
32
+ TestHost = "127.0.0.1"
33
+ TestPort = 8905
34
+
35
+ class SimpleTest < EventMachine::Protocols::HeaderAndContentProtocol
36
+ attr_reader :first_header, :my_headers, :request
37
+
38
+ def receive_first_header_line hdr
39
+ @first_header ||= []
40
+ @first_header << hdr
41
+ end
42
+ def receive_headers hdrs
43
+ @my_headers ||= []
44
+ @my_headers << hdrs
45
+ end
46
+ def receive_request hdrs, content
47
+ @request ||= []
48
+ @request << [hdrs, content]
49
+ end
50
+ end
51
+
52
+ class StopOnUnbind < EM::Connection
53
+ def unbind
54
+ EM.add_timer(0.1) { EM.stop }
55
+ end
56
+ end
57
+
58
+ def test_no_content
59
+ the_connection = nil
60
+ EM.run {
61
+ EM.start_server( TestHost, TestPort, SimpleTest ) do |conn|
62
+ the_connection = conn
63
+ end
64
+ setup_timeout
65
+
66
+ EM.connect TestHost, TestPort, StopOnUnbind do |c|
67
+ c.send_data [ "aaa\n", "bbb\r\n", "ccc\n", "\n" ].join
68
+ c.close_connection_after_writing
69
+ end
70
+ }
71
+ assert_equal( ["aaa"], the_connection.first_header )
72
+ assert_equal( [%w(aaa bbb ccc)], the_connection.my_headers )
73
+ assert_equal( [[%w(aaa bbb ccc), ""]], the_connection.request )
74
+ end
75
+
76
+ def test_content
77
+ the_connection = nil
78
+ content = "A" * 50
79
+ headers = ["aaa", "bbb", "Content-length: #{content.length}", "ccc"]
80
+ EventMachine.run {
81
+ EventMachine.start_server( TestHost, TestPort, SimpleTest ) do |conn|
82
+ the_connection = conn
83
+ end
84
+ setup_timeout
85
+
86
+ EM.connect TestHost, TestPort, StopOnUnbind do |c|
87
+ headers.each { |h| c.send_data "#{h}\r\n" }
88
+ c.send_data "\n"
89
+ c.send_data content
90
+ c.close_connection_after_writing
91
+ end
92
+ }
93
+ assert_equal( ["aaa"], the_connection.first_header )
94
+ assert_equal( [headers], the_connection.my_headers )
95
+ assert_equal( [[headers, content]], the_connection.request )
96
+ end
97
+
98
+ def test_several_requests
99
+ the_connection = nil
100
+ content = "A" * 50
101
+ headers = ["aaa", "bbb", "Content-length: #{content.length}", "ccc"]
102
+ EventMachine.run {
103
+ EventMachine.start_server( TestHost, TestPort, SimpleTest ) do |conn|
104
+ the_connection = conn
105
+ end
106
+ setup_timeout
107
+
108
+ EventMachine.connect( TestHost, TestPort, StopOnUnbind ) do |c|
109
+ 5.times do
110
+ headers.each { |h| c.send_data "#{h}\r\n" }
111
+ c.send_data "\n"
112
+ c.send_data content
113
+ end
114
+ c.close_connection_after_writing
115
+ end
116
+ }
117
+ assert_equal( ["aaa"] * 5, the_connection.first_header )
118
+ assert_equal( [headers] * 5, the_connection.my_headers )
119
+ assert_equal( [[headers, content]] * 5, the_connection.request )
120
+ end
121
+
122
+
123
+ # def x_test_multiple_content_length_headers
124
+ # # This is supposed to throw a RuntimeError but it throws a C++ exception instead.
125
+ # the_connection = nil
126
+ # content = "A" * 50
127
+ # headers = ["aaa", "bbb", ["Content-length: #{content.length}"]*2, "ccc"].flatten
128
+ # EventMachine.run {
129
+ # EventMachine.start_server( TestHost, TestPort, SimpleTest ) do |conn|
130
+ # the_connection = conn
131
+ # end
132
+ # EventMachine.add_timer(4) {raise "test timed out"}
133
+ # test_proc = proc {
134
+ # t = TCPSocket.new TestHost, TestPort
135
+ # headers.each {|h| t.write "#{h}\r\n" }
136
+ # t.write "\n"
137
+ # t.write content
138
+ # t.close
139
+ # }
140
+ # EventMachine.defer test_proc, proc {
141
+ # EventMachine.stop
142
+ # }
143
+ # }
144
+ # end
145
+
146
+ def test_interpret_headers
147
+ the_connection = nil
148
+ content = "A" * 50
149
+ headers = [
150
+ "GET / HTTP/1.0",
151
+ "Accept: aaa",
152
+ "User-Agent: bbb",
153
+ "Host: ccc",
154
+ "x-tempest-header:ddd"
155
+ ]
156
+
157
+ EventMachine.run {
158
+ EventMachine.start_server( TestHost, TestPort, SimpleTest ) do |conn|
159
+ the_connection = conn
160
+ end
161
+ setup_timeout
162
+
163
+ EventMachine.connect( TestHost, TestPort, StopOnUnbind ) do |c|
164
+ headers.each { |h| c.send_data "#{h}\r\n" }
165
+ c.send_data "\n"
166
+ c.send_data content
167
+ c.close_connection_after_writing
168
+ end
169
+ }
170
+
171
+ hsh = the_connection.headers_2_hash( the_connection.my_headers.shift )
172
+ expect = {
173
+ :accept => "aaa",
174
+ :user_agent => "bbb",
175
+ :host => "ccc",
176
+ :x_tempest_header => "ddd"
177
+ }
178
+ assert_equal(expect, hsh)
179
+ end
180
+
181
+ def setup_timeout(timeout = 4)
182
+ EM.schedule {
183
+ start_time = EM.current_time
184
+ EM.add_periodic_timer(0.01) {
185
+ raise "timeout" if EM.current_time - start_time >= timeout
186
+ }
187
+ }
188
+ end
189
+
190
+ end