eventmachine 0.12.0-i386-mswin32

Sign up to get free protection for your applications and to get access to all the features.
Files changed (104) hide show
  1. data/COPYING +60 -0
  2. data/DEFERRABLES +138 -0
  3. data/EPOLL +141 -0
  4. data/GNU +281 -0
  5. data/KEYBOARD +38 -0
  6. data/LEGAL +25 -0
  7. data/LIGHTWEIGHT_CONCURRENCY +72 -0
  8. data/PURE_RUBY +77 -0
  9. data/README +74 -0
  10. data/RELEASE_NOTES +96 -0
  11. data/SMTP +9 -0
  12. data/SPAWNED_PROCESSES +93 -0
  13. data/TODO +10 -0
  14. data/ext/Makefile +180 -0
  15. data/ext/binder.cpp +126 -0
  16. data/ext/binder.h +48 -0
  17. data/ext/cmain.cpp +527 -0
  18. data/ext/cplusplus.cpp +172 -0
  19. data/ext/ed.cpp +1442 -0
  20. data/ext/ed.h +351 -0
  21. data/ext/em.cpp +1781 -0
  22. data/ext/em.h +167 -0
  23. data/ext/emwin.cpp +300 -0
  24. data/ext/emwin.h +94 -0
  25. data/ext/epoll.cpp +26 -0
  26. data/ext/epoll.h +25 -0
  27. data/ext/eventmachine.h +83 -0
  28. data/ext/eventmachine_cpp.h +94 -0
  29. data/ext/extconf.rb +203 -0
  30. data/ext/files.cpp +94 -0
  31. data/ext/files.h +65 -0
  32. data/ext/kb.cpp +368 -0
  33. data/ext/mkmf.log +129 -0
  34. data/ext/page.cpp +107 -0
  35. data/ext/page.h +51 -0
  36. data/ext/pipe.cpp +327 -0
  37. data/ext/project.h +119 -0
  38. data/ext/rubyeventmachine-i386-mswin32.def +2 -0
  39. data/ext/rubyeventmachine-i386-mswin32.exp +0 -0
  40. data/ext/rubyeventmachine-i386-mswin32.lib +0 -0
  41. data/ext/rubyeventmachine-i386-mswin32.pdb +0 -0
  42. data/ext/rubyeventmachine.so +0 -0
  43. data/ext/rubymain.cpp +630 -0
  44. data/ext/sigs.cpp +89 -0
  45. data/ext/sigs.h +32 -0
  46. data/ext/ssl.cpp +408 -0
  47. data/ext/ssl.h +86 -0
  48. data/ext/vc60.pdb +0 -0
  49. data/lib/em/deferrable.rb +208 -0
  50. data/lib/em/eventable.rb +39 -0
  51. data/lib/em/future.rb +62 -0
  52. data/lib/em/messages.rb +66 -0
  53. data/lib/em/processes.rb +68 -0
  54. data/lib/em/spawnable.rb +88 -0
  55. data/lib/em/streamer.rb +112 -0
  56. data/lib/eventmachine.rb +1621 -0
  57. data/lib/eventmachine_version.rb +31 -0
  58. data/lib/evma.rb +32 -0
  59. data/lib/evma/callback.rb +32 -0
  60. data/lib/evma/container.rb +75 -0
  61. data/lib/evma/factory.rb +77 -0
  62. data/lib/evma/protocol.rb +87 -0
  63. data/lib/evma/reactor.rb +48 -0
  64. data/lib/jeventmachine.rb +106 -0
  65. data/lib/pr_eventmachine.rb +1011 -0
  66. data/lib/protocols/buftok.rb +127 -0
  67. data/lib/protocols/header_and_content.rb +123 -0
  68. data/lib/protocols/httpcli2.rb +784 -0
  69. data/lib/protocols/httpclient.rb +253 -0
  70. data/lib/protocols/line_and_text.rb +122 -0
  71. data/lib/protocols/linetext2.rb +145 -0
  72. data/lib/protocols/saslauth.rb +179 -0
  73. data/lib/protocols/smtpclient.rb +308 -0
  74. data/lib/protocols/smtpserver.rb +543 -0
  75. data/lib/protocols/stomp.rb +127 -0
  76. data/lib/protocols/tcptest.rb +57 -0
  77. data/lib/rubyeventmachine.so +0 -0
  78. data/tests/test_basic.rb +142 -0
  79. data/tests/test_defer.rb +63 -0
  80. data/tests/test_epoll.rb +168 -0
  81. data/tests/test_errors.rb +82 -0
  82. data/tests/test_eventables.rb +78 -0
  83. data/tests/test_exc.rb +58 -0
  84. data/tests/test_futures.rb +214 -0
  85. data/tests/test_hc.rb +221 -0
  86. data/tests/test_httpclient.rb +194 -0
  87. data/tests/test_httpclient2.rb +133 -0
  88. data/tests/test_kb.rb +61 -0
  89. data/tests/test_ltp.rb +190 -0
  90. data/tests/test_ltp2.rb +261 -0
  91. data/tests/test_next_tick.rb +58 -0
  92. data/tests/test_processes.rb +56 -0
  93. data/tests/test_pure.rb +128 -0
  94. data/tests/test_running.rb +47 -0
  95. data/tests/test_sasl.rb +73 -0
  96. data/tests/test_send_file.rb +238 -0
  97. data/tests/test_servers.rb +90 -0
  98. data/tests/test_smtpclient.rb +81 -0
  99. data/tests/test_smtpserver.rb +93 -0
  100. data/tests/test_spawn.rb +329 -0
  101. data/tests/test_timers.rb +138 -0
  102. data/tests/test_ud.rb +43 -0
  103. data/tests/testem.rb +5 -0
  104. metadata +170 -0
@@ -0,0 +1,82 @@
1
+ # $Id: test_errors.rb 668 2008-01-04 23:00:34Z blackhedd $
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
+
28
+ ###### THIS TEST IS NOW OBSOLETE.
29
+ ###### As of 27Dec07, the hookable error handling is obsolete because
30
+ ###### of its performance impact.
31
+
32
+
33
+ $:.unshift "../lib"
34
+ require 'eventmachine'
35
+ require 'test/unit'
36
+
37
+ class TestErrors < Test::Unit::TestCase
38
+
39
+ Localhost = "127.0.0.1"
40
+ Localport = 9801
41
+
42
+ def setup
43
+ end
44
+
45
+ def teardown
46
+ # Calling #set_runtime_error_hook with no block restores the
47
+ # default handling of runtime_errors.
48
+ #
49
+ EM.set_runtime_error_hook
50
+ end
51
+
52
+ def test_a
53
+ end
54
+
55
+ # EM has a default handler for RuntimeErrors that are emitted from
56
+ # user written code. You can override the handler if you wish, but it's
57
+ # easier to call #set_runtime_error_hook.
58
+ # Ordinarily, an error in user code invoked by the reactor aborts the
59
+ # run.
60
+ #
61
+ def obsolete_test_unhandled_error
62
+ assert_raise( RuntimeError ) {
63
+ EM.run {
64
+ EM.add_timer(0) {raise "AAA"}
65
+ }
66
+ }
67
+
68
+ end
69
+
70
+ def obsolete_test_handled_error
71
+ err = nil
72
+ EM.run {
73
+ EM.set_runtime_error_hook {
74
+ err = true
75
+ EM.stop
76
+ }
77
+ EM.add_timer(0) {raise "AAA"}
78
+ }
79
+ assert err
80
+ end
81
+ end
82
+
@@ -0,0 +1,78 @@
1
+ # $Id: test_eventables.rb 668 2008-01-04 23:00:34Z blackhedd $
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
+
30
+ require 'test/unit/testsuite'
31
+ require 'test/unit/ui/console/testrunner'
32
+
33
+
34
+ class TestEventables < Test::Unit::TestCase
35
+
36
+ class EvTest
37
+ include EventMachine::Eventable
38
+ end
39
+
40
+ def setup
41
+ end
42
+
43
+ def teardown
44
+ end
45
+
46
+ def test_a; end # shut up rake until we define a test.
47
+
48
+ # TODO, this idea is still half-baked.
49
+ def xxx_test_a
50
+ n = 0
51
+ tester = EvTest.new
52
+ tester.listen_event( :fire1 ) {|arg|
53
+ n = 1 if arg == "$"
54
+ EventMachine.stop
55
+ }
56
+ tester.post_event( :fire1, "$" )
57
+
58
+ EventMachine.run {
59
+ EventMachine::add_timer(1) {EventMachine.stop}
60
+ }
61
+
62
+ assert_equal( 1, n )
63
+ end
64
+
65
+ end
66
+
67
+
68
+ #--------------------------------------
69
+
70
+ if __FILE__ == $0
71
+ runner = Test::Unit::UI::Console::TestRunner
72
+ suite = Test::Unit::TestSuite.new("name")
73
+ ObjectSpace.each_object(Class) do |testcase|
74
+ suite << testcase.suite if testcase < Test::Unit::TestCase
75
+ end
76
+ runner.run(suite)
77
+ end
78
+
@@ -0,0 +1,58 @@
1
+ # $Id: test_exc.rb 668 2008-01-04 23:00:34Z blackhedd $
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
+ $:.unshift "../lib"
27
+ require 'eventmachine'
28
+ require 'test/unit'
29
+
30
+ class TestSomeExceptions < Test::Unit::TestCase
31
+
32
+
33
+ # Read the commentary in EventMachine#run.
34
+ # This test exercises the ensure block in #run that makes sure
35
+ # EventMachine#release_machine gets called even if an exception is
36
+ # thrown within the user code. Without the ensured call to release_machine,
37
+ # the second call to EventMachine#run will fail with a C++ exception
38
+ # because the machine wasn't cleaned up properly.
39
+
40
+ def test_a
41
+ assert_raise(RuntimeError) {
42
+ EventMachine.run {
43
+ raise "some exception"
44
+ }
45
+ }
46
+ end
47
+
48
+ def test_b
49
+ assert_raise(RuntimeError) {
50
+ EventMachine.run {
51
+ raise "some exception"
52
+ }
53
+ }
54
+ end
55
+
56
+
57
+ end
58
+
@@ -0,0 +1,214 @@
1
+ # $Id: test_futures.rb 668 2008-01-04 23:00:34Z blackhedd $
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
+
32
+
33
+ class TestFutures < Test::Unit::TestCase
34
+
35
+ def setup
36
+ end
37
+
38
+ def teardown
39
+ end
40
+
41
+ def test_future
42
+ assert_equal(100, EventMachine::Deferrable.future(100) )
43
+
44
+ p1 = proc { 100 + 1 }
45
+ assert_equal(101, EventMachine::Deferrable.future(p1) )
46
+ end
47
+
48
+
49
+
50
+ class MyFuture
51
+ include EventMachine::Deferrable
52
+ def initialize *args
53
+ super
54
+ set_deferred_status :succeeded, 40
55
+ end
56
+ end
57
+
58
+ class MyErrorFuture
59
+ include EventMachine::Deferrable
60
+ def initialize *args
61
+ super
62
+ set_deferred_status :failed, 41
63
+ end
64
+ end
65
+
66
+
67
+ def test_future_1
68
+ # Call future with one additional argument and it will be treated as a callback.
69
+ def my_future
70
+ MyFuture.new
71
+ end
72
+
73
+ value = nil
74
+ EventMachine::Deferrable.future my_future, proc {|v| value=v}
75
+ assert_equal( 40, value )
76
+ end
77
+
78
+
79
+ def test_future_2
80
+ # Call future with two additional arguments and they will be treated as a callback
81
+ # and an errback.
82
+ value = nil
83
+ EventMachine::Deferrable.future MyErrorFuture.new, nil, proc {|v| value=v}
84
+ assert_equal( 41, value )
85
+ end
86
+
87
+
88
+ def test_future_3
89
+ # Call future with no additional arguments but with a block, and the block will be
90
+ # treated as a callback.
91
+ value = nil
92
+ EventMachine::Deferrable.future MyFuture.new do |v|
93
+ value=v
94
+ end
95
+ assert_equal( 40, value )
96
+ end
97
+
98
+
99
+ class RecursiveCallback
100
+ include EventMachine::Deferrable
101
+ end
102
+
103
+ # A Deferrable callback can call #set_deferred_status to change the values
104
+ # passed to subsequent callbacks.
105
+ #
106
+ def test_recursive_callbacks
107
+ n = 0 # counter assures that all the tests actually run.
108
+ rc = RecursiveCallback.new
109
+ rc.callback {|a|
110
+ assert_equal(100, a)
111
+ n += 1
112
+ rc.set_deferred_status :succeeded, 101, 101
113
+ }
114
+ rc.callback {|a,b|
115
+ assert_equal(101, a)
116
+ assert_equal(101, b)
117
+ n += 1
118
+ rc.set_deferred_status :succeeded, 102, 102, 102
119
+ }
120
+ rc.callback {|a,b,c|
121
+ assert_equal(102, a)
122
+ assert_equal(102, b)
123
+ assert_equal(102, c)
124
+ n += 1
125
+ }
126
+ rc.set_deferred_status :succeeded, 100
127
+ assert_equal(3, n)
128
+ end
129
+
130
+
131
+
132
+ def test_syntactic_sugar
133
+ rc = RecursiveCallback.new
134
+ rc.set_deferred_success 100
135
+ rc.set_deferred_failure 200
136
+ end
137
+
138
+
139
+
140
+ # It doesn't raise an error to set deferred status more than once.
141
+ # In fact, this is a desired and useful idiom when it happens INSIDE
142
+ # a callback or errback.
143
+ # However, it's less useful otherwise, and in fact would generally be
144
+ # indicative of a programming error. However, we would like to be resistant
145
+ # to such errors. So whenever we set deferred status, we also clear BOTH
146
+ # stacks of handlers.
147
+ #
148
+ def test_double_calls
149
+ s = 0
150
+ e = 0
151
+
152
+ d = EM::DefaultDeferrable.new
153
+ d.callback {s += 1}
154
+ d.errback {e += 1}
155
+
156
+ d.succeed # We expect the callback to be called, and the errback to be DISCARDED.
157
+ d.fail # Presumably an error. We expect the errback NOT to be called.
158
+ d.succeed # We expect the callback to have been discarded and NOT to be called again.
159
+
160
+ assert_equal(1, s)
161
+ assert_equal(0, e)
162
+ end
163
+
164
+
165
+ # Adding a callback to a Deferrable that is already in a success state executes the callback
166
+ # immediately. The same applies to a an errback added to an already-failed Deferrable.
167
+ # HOWEVER, we expect NOT to be able to add errbacks to succeeded Deferrables, or callbacks
168
+ # to failed ones.
169
+ #
170
+ # We illustrate this with a rather contrived test. The test calls #fail after #succeed,
171
+ # which ordinarily would not happen in a real program.
172
+ #
173
+ # What we're NOT attempting to specify is what happens if a Deferrable is succeeded and then
174
+ # failed (or vice-versa). Should we then be able to add callbacks/errbacks of the appropriate
175
+ # type for immediate execution? For now at least, the official answer is "don't do that."
176
+ #
177
+ def test_delayed_callbacks
178
+ s1 = 0
179
+ s2 = 0
180
+ e = 0
181
+
182
+ d = EM::DefaultDeferrable.new
183
+ d.callback {s1 += 1}
184
+
185
+ d.succeed # Triggers and discards the callback.
186
+
187
+ d.callback {s2 += 1} # This callback is executed immediately and discarded.
188
+
189
+ d.errback {e += 1} # This errback should be DISCARDED and never execute.
190
+ d.fail # To prove it, let's
191
+
192
+ assert_equal( [1,1], [s1,s2] )
193
+ assert_equal( 0, e )
194
+ end
195
+
196
+
197
+
198
+
199
+ #
200
+ #
201
+ #
202
+ def test_timeout
203
+ n = 0
204
+ EM.run {
205
+ d = EM::DefaultDeferrable.new
206
+ d.callback {n = 1; EM.stop}
207
+ d.errback {n = 2; EM.stop}
208
+ d.timeout(1)
209
+ }
210
+ assert_equal( 2, n )
211
+ end
212
+
213
+ end
214
+
@@ -0,0 +1,221 @@
1
+ # $Id: test_hc.rb 668 2008-01-04 23:00:34Z blackhedd $
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 'socket'
30
+ require 'test/unit'
31
+
32
+ # This doesn't completely work under Ruby 1.9.
33
+ # Part of it is thread race conditions. I added some sleeps to make these
34
+ # tests work. Native threads do strange things when you do I/O on them.
35
+ #
36
+
37
+
38
+ class TestHeaderAndContentProtocol < Test::Unit::TestCase
39
+
40
+ TestHost = "127.0.0.1"
41
+ TestPort = 8905
42
+
43
+
44
+ #--------------------------------------------------------------------
45
+
46
+ class SimpleTest < EventMachine::Protocols::HeaderAndContentProtocol
47
+ attr_reader :first_header, :my_headers, :request
48
+
49
+ def receive_first_header_line hdr
50
+ @first_header ||= []
51
+ @first_header << hdr
52
+ end
53
+ def receive_headers hdrs
54
+ @my_headers ||= []
55
+ @my_headers << hdrs
56
+ end
57
+ def receive_request hdrs, content
58
+ @request ||= []
59
+ @request << [hdrs, content]
60
+ end
61
+ end
62
+
63
+ def test_no_content
64
+ Thread.abort_on_exception = true
65
+ the_connection = nil
66
+ EventMachine.run {
67
+ EventMachine.start_server( TestHost, TestPort, SimpleTest ) do |conn|
68
+ the_connection = conn
69
+ end
70
+ EventMachine.add_timer(4) {raise "test timed out"}
71
+ EventMachine.defer proc {
72
+ t = TCPSocket.new TestHost, TestPort
73
+ t.write [
74
+ "aaa\n", "bbb\r\n", "ccc\n", "\n"
75
+ ].join
76
+ t.close
77
+ if RUBY_VERSION =~ /\A1\.9\./
78
+ sleep 0.1
79
+ STDERR.puts "Introducing extraneous sleep for Ruby 1.9"
80
+ end
81
+ }, proc {
82
+ EventMachine.stop
83
+ }
84
+ }
85
+ assert_equal( ["aaa"], the_connection.first_header )
86
+ assert_equal( [%w(aaa bbb ccc)], the_connection.my_headers )
87
+ assert_equal( [[%w(aaa bbb ccc), ""]], the_connection.request )
88
+ end
89
+
90
+ def test_content
91
+ Thread.abort_on_exception = true
92
+ the_connection = nil
93
+ content = "A" * 50
94
+ headers = ["aaa", "bbb", "Content-length: #{content.length}", "ccc"]
95
+ EventMachine.run {
96
+ EventMachine.start_server( TestHost, TestPort, SimpleTest ) do |conn|
97
+ the_connection = conn
98
+ end
99
+ EventMachine.add_timer(4) {raise "test timed out"}
100
+ EventMachine.defer proc {
101
+ t = TCPSocket.new TestHost, TestPort
102
+ headers.each {|h| t.write "#{h}\r\n" }
103
+ t.write "\n"
104
+ t.write content
105
+ t.close
106
+ if RUBY_VERSION =~ /\A1\.9\./
107
+ sleep 0.1
108
+ STDERR.puts "Introducing extraneous sleep for Ruby 1.9"
109
+ end
110
+ }, proc {
111
+ EM.stop
112
+ }
113
+ }
114
+ assert_equal( ["aaa"], the_connection.first_header )
115
+ assert_equal( [headers], the_connection.my_headers )
116
+ assert_equal( [[headers, content]], the_connection.request )
117
+ end
118
+
119
+ def test_several_requests
120
+ Thread.abort_on_exception = true
121
+ the_connection = nil
122
+ content = "A" * 50
123
+ headers = ["aaa", "bbb", "Content-length: #{content.length}", "ccc"]
124
+ EventMachine.run {
125
+ EventMachine.start_server( TestHost, TestPort, SimpleTest ) do |conn|
126
+ the_connection = conn
127
+ end
128
+ EventMachine.add_timer(4) {raise "test timed out"}
129
+ EventMachine.defer proc {
130
+ t = TCPSocket.new TestHost, TestPort
131
+ 5.times {
132
+ headers.each {|h| t.write "#{h}\r\n" }
133
+ t.write "\n"
134
+ t.write content
135
+ }
136
+ t.close
137
+ if RUBY_VERSION =~ /\A1\.9\./
138
+ sleep 0.1
139
+ STDERR.puts "Introducing extraneous sleep for Ruby 1.9"
140
+ end
141
+ }, proc {
142
+ EventMachine.stop
143
+ }
144
+ }
145
+ assert_equal( ["aaa"] * 5, the_connection.first_header )
146
+ assert_equal( [headers] * 5, the_connection.my_headers )
147
+ assert_equal( [[headers, content]] * 5, the_connection.request )
148
+ end
149
+
150
+
151
+ def x_test_multiple_content_length_headers
152
+ # This is supposed to throw a RuntimeError but it throws a C++ exception instead.
153
+ Thread.abort_on_exception = true
154
+ the_connection = nil
155
+ content = "A" * 50
156
+ headers = ["aaa", "bbb", ["Content-length: #{content.length}"]*2, "ccc"].flatten
157
+ EventMachine.run {
158
+ EventMachine.start_server( TestHost, TestPort, SimpleTest ) do |conn|
159
+ the_connection = conn
160
+ end
161
+ EventMachine.add_timer(4) {raise "test timed out"}
162
+ EventMachine.defer proc {
163
+ t = TCPSocket.new TestHost, TestPort
164
+ headers.each {|h| t.write "#{h}\r\n" }
165
+ t.write "\n"
166
+ t.write content
167
+ t.close
168
+ }, proc {
169
+ EventMachine.stop
170
+ }
171
+ }
172
+ end
173
+
174
+ def test_interpret_headers
175
+ Thread.abort_on_exception = true
176
+ the_connection = nil
177
+ content = "A" * 50
178
+ headers = [
179
+ "GET / HTTP/1.0",
180
+ "Accept: aaa",
181
+ "User-Agent: bbb",
182
+ "Host: ccc",
183
+ "x-tempest-header:ddd"
184
+ ]
185
+ EventMachine.run {
186
+ EventMachine.start_server( TestHost, TestPort, SimpleTest ) do |conn|
187
+ the_connection = conn
188
+ end
189
+ EventMachine.add_timer(4) {raise "test timed out"}
190
+ EventMachine.defer proc {
191
+ t = TCPSocket.new TestHost, TestPort
192
+ headers.each {|h| t.write "#{h}\r\n" }
193
+ t.write "\n"
194
+ t.write content
195
+ t.close
196
+ if RUBY_VERSION =~ /\A1\.9\./
197
+ sleep 0.1
198
+ STDERR.puts "Introducing extraneous sleep for Ruby 1.9"
199
+ end
200
+ }, proc {
201
+ EventMachine.stop
202
+ }
203
+ }
204
+
205
+ hsh = the_connection.headers_2_hash( the_connection.my_headers.shift )
206
+ assert_equal(
207
+ {
208
+ :accept => "aaa",
209
+ :user_agent => "bbb",
210
+ :host => "ccc",
211
+ :x_tempest_header => "ddd"
212
+ },
213
+ hsh
214
+ )
215
+ end
216
+
217
+ #--------------------------------------------------------------------
218
+
219
+ end
220
+
221
+