eventmachine 1.2.0.dev.2-x64-mingw32

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 (181) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +105 -0
  3. data/GNU +281 -0
  4. data/LICENSE +60 -0
  5. data/README.md +108 -0
  6. data/docs/DocumentationGuidesIndex.md +27 -0
  7. data/docs/GettingStarted.md +521 -0
  8. data/docs/old/ChangeLog +211 -0
  9. data/docs/old/DEFERRABLES +246 -0
  10. data/docs/old/EPOLL +141 -0
  11. data/docs/old/INSTALL +13 -0
  12. data/docs/old/KEYBOARD +42 -0
  13. data/docs/old/LEGAL +25 -0
  14. data/docs/old/LIGHTWEIGHT_CONCURRENCY +130 -0
  15. data/docs/old/PURE_RUBY +75 -0
  16. data/docs/old/RELEASE_NOTES +94 -0
  17. data/docs/old/SMTP +4 -0
  18. data/docs/old/SPAWNED_PROCESSES +148 -0
  19. data/docs/old/TODO +8 -0
  20. data/examples/guides/getting_started/01_eventmachine_echo_server.rb +18 -0
  21. data/examples/guides/getting_started/02_eventmachine_echo_server_that_recognizes_exit_command.rb +22 -0
  22. data/examples/guides/getting_started/03_simple_chat_server.rb +149 -0
  23. data/examples/guides/getting_started/04_simple_chat_server_step_one.rb +27 -0
  24. data/examples/guides/getting_started/05_simple_chat_server_step_two.rb +43 -0
  25. data/examples/guides/getting_started/06_simple_chat_server_step_three.rb +98 -0
  26. data/examples/guides/getting_started/07_simple_chat_server_step_four.rb +121 -0
  27. data/examples/guides/getting_started/08_simple_chat_server_step_five.rb +141 -0
  28. data/examples/old/ex_channel.rb +43 -0
  29. data/examples/old/ex_queue.rb +2 -0
  30. data/examples/old/ex_tick_loop_array.rb +15 -0
  31. data/examples/old/ex_tick_loop_counter.rb +32 -0
  32. data/examples/old/helper.rb +2 -0
  33. data/ext/binder.cpp +124 -0
  34. data/ext/binder.h +46 -0
  35. data/ext/cmain.cpp +988 -0
  36. data/ext/ed.cpp +2111 -0
  37. data/ext/ed.h +442 -0
  38. data/ext/em.cpp +2379 -0
  39. data/ext/em.h +308 -0
  40. data/ext/eventmachine.h +143 -0
  41. data/ext/extconf.rb +270 -0
  42. data/ext/fastfilereader/extconf.rb +110 -0
  43. data/ext/fastfilereader/mapper.cpp +216 -0
  44. data/ext/fastfilereader/mapper.h +59 -0
  45. data/ext/fastfilereader/rubymain.cpp +127 -0
  46. data/ext/kb.cpp +79 -0
  47. data/ext/page.cpp +107 -0
  48. data/ext/page.h +51 -0
  49. data/ext/pipe.cpp +354 -0
  50. data/ext/project.h +176 -0
  51. data/ext/rubymain.cpp +1504 -0
  52. data/ext/ssl.cpp +615 -0
  53. data/ext/ssl.h +103 -0
  54. data/java/.classpath +8 -0
  55. data/java/.project +17 -0
  56. data/java/src/com/rubyeventmachine/EmReactor.java +591 -0
  57. data/java/src/com/rubyeventmachine/EmReactorException.java +40 -0
  58. data/java/src/com/rubyeventmachine/EventableChannel.java +72 -0
  59. data/java/src/com/rubyeventmachine/EventableDatagramChannel.java +201 -0
  60. data/java/src/com/rubyeventmachine/EventableSocketChannel.java +415 -0
  61. data/lib/2.0/fastfilereaderext.so +0 -0
  62. data/lib/2.0/rubyeventmachine.so +0 -0
  63. data/lib/2.1/fastfilereaderext.so +0 -0
  64. data/lib/2.1/rubyeventmachine.so +0 -0
  65. data/lib/2.2/fastfilereaderext.so +0 -0
  66. data/lib/2.2/rubyeventmachine.so +0 -0
  67. data/lib/2.3/fastfilereaderext.so +0 -0
  68. data/lib/2.3/rubyeventmachine.so +0 -0
  69. data/lib/em/buftok.rb +59 -0
  70. data/lib/em/callback.rb +58 -0
  71. data/lib/em/channel.rb +69 -0
  72. data/lib/em/completion.rb +304 -0
  73. data/lib/em/connection.rb +770 -0
  74. data/lib/em/deferrable.rb +210 -0
  75. data/lib/em/deferrable/pool.rb +2 -0
  76. data/lib/em/file_watch.rb +73 -0
  77. data/lib/em/future.rb +61 -0
  78. data/lib/em/iterator.rb +252 -0
  79. data/lib/em/messages.rb +66 -0
  80. data/lib/em/pool.rb +151 -0
  81. data/lib/em/process_watch.rb +45 -0
  82. data/lib/em/processes.rb +123 -0
  83. data/lib/em/protocols.rb +37 -0
  84. data/lib/em/protocols/header_and_content.rb +138 -0
  85. data/lib/em/protocols/httpclient.rb +299 -0
  86. data/lib/em/protocols/httpclient2.rb +600 -0
  87. data/lib/em/protocols/line_and_text.rb +125 -0
  88. data/lib/em/protocols/line_protocol.rb +29 -0
  89. data/lib/em/protocols/linetext2.rb +166 -0
  90. data/lib/em/protocols/memcache.rb +331 -0
  91. data/lib/em/protocols/object_protocol.rb +46 -0
  92. data/lib/em/protocols/postgres3.rb +246 -0
  93. data/lib/em/protocols/saslauth.rb +175 -0
  94. data/lib/em/protocols/smtpclient.rb +394 -0
  95. data/lib/em/protocols/smtpserver.rb +666 -0
  96. data/lib/em/protocols/socks4.rb +66 -0
  97. data/lib/em/protocols/stomp.rb +205 -0
  98. data/lib/em/protocols/tcptest.rb +54 -0
  99. data/lib/em/pure_ruby.rb +1022 -0
  100. data/lib/em/queue.rb +80 -0
  101. data/lib/em/resolver.rb +232 -0
  102. data/lib/em/spawnable.rb +84 -0
  103. data/lib/em/streamer.rb +118 -0
  104. data/lib/em/threaded_resource.rb +90 -0
  105. data/lib/em/tick_loop.rb +85 -0
  106. data/lib/em/timers.rb +61 -0
  107. data/lib/em/version.rb +3 -0
  108. data/lib/eventmachine.rb +1584 -0
  109. data/lib/fastfilereaderext.rb +2 -0
  110. data/lib/jeventmachine.rb +301 -0
  111. data/lib/rubyeventmachine.rb +2 -0
  112. data/rakelib/package.rake +120 -0
  113. data/rakelib/test.rake +8 -0
  114. data/tests/client.crt +31 -0
  115. data/tests/client.key +51 -0
  116. data/tests/dhparam.pem +13 -0
  117. data/tests/em_test_helper.rb +151 -0
  118. data/tests/test_attach.rb +151 -0
  119. data/tests/test_basic.rb +283 -0
  120. data/tests/test_channel.rb +75 -0
  121. data/tests/test_completion.rb +178 -0
  122. data/tests/test_connection_count.rb +54 -0
  123. data/tests/test_connection_write.rb +35 -0
  124. data/tests/test_defer.rb +35 -0
  125. data/tests/test_deferrable.rb +35 -0
  126. data/tests/test_epoll.rb +142 -0
  127. data/tests/test_error_handler.rb +38 -0
  128. data/tests/test_exc.rb +28 -0
  129. data/tests/test_file_watch.rb +66 -0
  130. data/tests/test_fork.rb +75 -0
  131. data/tests/test_futures.rb +170 -0
  132. data/tests/test_get_sock_opt.rb +37 -0
  133. data/tests/test_handler_check.rb +35 -0
  134. data/tests/test_hc.rb +155 -0
  135. data/tests/test_httpclient.rb +233 -0
  136. data/tests/test_httpclient2.rb +128 -0
  137. data/tests/test_idle_connection.rb +25 -0
  138. data/tests/test_inactivity_timeout.rb +54 -0
  139. data/tests/test_ipv4.rb +125 -0
  140. data/tests/test_ipv6.rb +131 -0
  141. data/tests/test_iterator.rb +115 -0
  142. data/tests/test_kb.rb +28 -0
  143. data/tests/test_line_protocol.rb +33 -0
  144. data/tests/test_ltp.rb +138 -0
  145. data/tests/test_ltp2.rb +308 -0
  146. data/tests/test_many_fds.rb +22 -0
  147. data/tests/test_next_tick.rb +104 -0
  148. data/tests/test_object_protocol.rb +36 -0
  149. data/tests/test_pause.rb +107 -0
  150. data/tests/test_pending_connect_timeout.rb +52 -0
  151. data/tests/test_pool.rb +196 -0
  152. data/tests/test_process_watch.rb +50 -0
  153. data/tests/test_processes.rb +128 -0
  154. data/tests/test_proxy_connection.rb +180 -0
  155. data/tests/test_pure.rb +88 -0
  156. data/tests/test_queue.rb +64 -0
  157. data/tests/test_resolver.rb +104 -0
  158. data/tests/test_running.rb +14 -0
  159. data/tests/test_sasl.rb +47 -0
  160. data/tests/test_send_file.rb +217 -0
  161. data/tests/test_servers.rb +33 -0
  162. data/tests/test_set_sock_opt.rb +39 -0
  163. data/tests/test_shutdown_hooks.rb +23 -0
  164. data/tests/test_smtpclient.rb +75 -0
  165. data/tests/test_smtpserver.rb +57 -0
  166. data/tests/test_spawn.rb +293 -0
  167. data/tests/test_ssl_args.rb +78 -0
  168. data/tests/test_ssl_dhparam.rb +83 -0
  169. data/tests/test_ssl_ecdh_curve.rb +79 -0
  170. data/tests/test_ssl_extensions.rb +49 -0
  171. data/tests/test_ssl_methods.rb +65 -0
  172. data/tests/test_ssl_protocols.rb +246 -0
  173. data/tests/test_ssl_verify.rb +126 -0
  174. data/tests/test_stomp.rb +37 -0
  175. data/tests/test_system.rb +46 -0
  176. data/tests/test_threaded_resource.rb +61 -0
  177. data/tests/test_tick_loop.rb +59 -0
  178. data/tests/test_timers.rb +123 -0
  179. data/tests/test_ud.rb +8 -0
  180. data/tests/test_unbind_reason.rb +52 -0
  181. metadata +381 -0
@@ -0,0 +1,155 @@
1
+ require 'em_test_helper'
2
+
3
+ class TestHeaderAndContentProtocol < Test::Unit::TestCase
4
+
5
+ class SimpleTest < EM::P::HeaderAndContentProtocol
6
+ attr_reader :first_header, :my_headers, :request
7
+
8
+ def receive_first_header_line hdr
9
+ @first_header ||= []
10
+ @first_header << hdr
11
+ end
12
+ def receive_headers hdrs
13
+ @my_headers ||= []
14
+ @my_headers << hdrs
15
+ end
16
+ def receive_request hdrs, content
17
+ @request ||= []
18
+ @request << [hdrs, content]
19
+ end
20
+ end
21
+
22
+ class StopOnUnbind < EM::Connection
23
+ def unbind
24
+ EM.add_timer(0.01) { EM.stop }
25
+ end
26
+ end
27
+
28
+ def setup
29
+ @port = next_port
30
+ end
31
+
32
+ def test_no_content
33
+ the_connection = nil
34
+ EM.run {
35
+ EM.start_server( "127.0.0.1", @port, SimpleTest ) do |conn|
36
+ the_connection = conn
37
+ end
38
+ setup_timeout
39
+
40
+ EM.connect "127.0.0.1", @port, StopOnUnbind do |c|
41
+ c.send_data [ "aaa\n", "bbb\r\n", "ccc\n", "\n" ].join
42
+ c.close_connection_after_writing
43
+ end
44
+ }
45
+ assert_equal( ["aaa"], the_connection.first_header )
46
+ assert_equal( [%w(aaa bbb ccc)], the_connection.my_headers )
47
+ assert_equal( [[%w(aaa bbb ccc), ""]], the_connection.request )
48
+ end
49
+
50
+ def test_content
51
+ the_connection = nil
52
+ content = "A" * 50
53
+ headers = ["aaa", "bbb", "Content-length: #{content.length}", "ccc"]
54
+ EM.run {
55
+ EM.start_server( "127.0.0.1", @port, SimpleTest ) do |conn|
56
+ the_connection = conn
57
+ end
58
+ setup_timeout
59
+
60
+ EM.connect "127.0.0.1", @port, StopOnUnbind do |c|
61
+ headers.each { |h| c.send_data "#{h}\r\n" }
62
+ c.send_data "\n"
63
+ c.send_data content
64
+ c.close_connection_after_writing
65
+ end
66
+ }
67
+ assert_equal( ["aaa"], the_connection.first_header )
68
+ assert_equal( [headers], the_connection.my_headers )
69
+ assert_equal( [[headers, content]], the_connection.request )
70
+ end
71
+
72
+ def test_several_requests
73
+ the_connection = nil
74
+ content = "A" * 50
75
+ headers = ["aaa", "bbb", "Content-length: #{content.length}", "ccc"]
76
+ EM.run {
77
+ EM.start_server( "127.0.0.1", @port, SimpleTest ) do |conn|
78
+ the_connection = conn
79
+ end
80
+ setup_timeout
81
+
82
+ EM.connect( "127.0.0.1", @port, StopOnUnbind ) do |c|
83
+ 5.times do
84
+ headers.each { |h| c.send_data "#{h}\r\n" }
85
+ c.send_data "\n"
86
+ c.send_data content
87
+ end
88
+ c.close_connection_after_writing
89
+ end
90
+ }
91
+ assert_equal( ["aaa"] * 5, the_connection.first_header )
92
+ assert_equal( [headers] * 5, the_connection.my_headers )
93
+ assert_equal( [[headers, content]] * 5, the_connection.request )
94
+ end
95
+
96
+
97
+ # def x_test_multiple_content_length_headers
98
+ # # This is supposed to throw a RuntimeError but it throws a C++ exception instead.
99
+ # the_connection = nil
100
+ # content = "A" * 50
101
+ # headers = ["aaa", "bbb", ["Content-length: #{content.length}"]*2, "ccc"].flatten
102
+ # EM.run {
103
+ # EM.start_server( "127.0.0.1", @port, SimpleTest ) do |conn|
104
+ # the_connection = conn
105
+ # end
106
+ # EM.add_timer(4) {raise "test timed out"}
107
+ # test_proc = proc {
108
+ # t = TCPSocket.new "127.0.0.1", @port
109
+ # headers.each {|h| t.write "#{h}\r\n" }
110
+ # t.write "\n"
111
+ # t.write content
112
+ # t.close
113
+ # }
114
+ # EM.defer test_proc, proc {
115
+ # EM.stop
116
+ # }
117
+ # }
118
+ # end
119
+
120
+ def test_interpret_headers
121
+ the_connection = nil
122
+ content = "A" * 50
123
+ headers = [
124
+ "GET / HTTP/1.0",
125
+ "Accept: aaa",
126
+ "User-Agent: bbb",
127
+ "Host: ccc",
128
+ "x-tempest-header:ddd"
129
+ ]
130
+
131
+ EM.run {
132
+ EM.start_server( "127.0.0.1", @port, SimpleTest ) do |conn|
133
+ the_connection = conn
134
+ end
135
+ setup_timeout
136
+
137
+ EM.connect( "127.0.0.1", @port, StopOnUnbind ) do |c|
138
+ headers.each { |h| c.send_data "#{h}\r\n" }
139
+ c.send_data "\n"
140
+ c.send_data content
141
+ c.close_connection_after_writing
142
+ end
143
+ }
144
+
145
+ hsh = the_connection.headers_2_hash( the_connection.my_headers.shift )
146
+ expect = {
147
+ :accept => "aaa",
148
+ :user_agent => "bbb",
149
+ :host => "ccc",
150
+ :x_tempest_header => "ddd"
151
+ }
152
+ assert_equal(expect, hsh)
153
+ end
154
+
155
+ end
@@ -0,0 +1,233 @@
1
+ require 'em_test_helper'
2
+
3
+ class TestHttpClient < Test::Unit::TestCase
4
+
5
+ Localhost = "127.0.0.1"
6
+ Localport = 9801
7
+
8
+ def setup
9
+ end
10
+
11
+ def teardown
12
+ end
13
+
14
+ #-------------------------------------
15
+
16
+ def test_http_client
17
+ ok = false
18
+ EM.run {
19
+ c = silent { EM::P::HttpClient.send :request, :host => "www.google.com", :port => 80 }
20
+ c.callback {
21
+ ok = true
22
+ EM.stop
23
+ }
24
+ c.errback {EM.stop} # necessary, otherwise a failure blocks the test suite forever.
25
+ }
26
+ assert ok
27
+ end
28
+
29
+ #-------------------------------------
30
+
31
+ def test_http_client_1
32
+ ok = false
33
+ EM.run {
34
+ c = silent { EM::P::HttpClient.send :request, :host => "www.google.com", :port => 80 }
35
+ c.callback {ok = true; EM.stop}
36
+ c.errback {EM.stop}
37
+ }
38
+ assert ok
39
+ end
40
+
41
+ #-------------------------------------
42
+
43
+ def test_http_client_2
44
+ ok = false
45
+ EM.run {
46
+ c = silent { EM::P::HttpClient.send :request, :host => "www.google.com", :port => 80 }
47
+ c.callback {|result|
48
+ ok = true;
49
+ EM.stop
50
+ }
51
+ c.errback {EM.stop}
52
+ }
53
+ assert ok
54
+ end
55
+
56
+
57
+ #-----------------------------------------
58
+
59
+ # Test a server that returns a page with a zero content-length.
60
+ # This caused an early version of the HTTP client not to generate a response,
61
+ # causing this test to hang. Observe, there was no problem with responses
62
+ # lacking a content-length, just when the content-length was zero.
63
+ #
64
+ class EmptyContent < EM::Connection
65
+ def initialize *args
66
+ super
67
+ end
68
+ def receive_data data
69
+ send_data "HTTP/1.0 404 ...\r\nContent-length: 0\r\n\r\n"
70
+ close_connection_after_writing
71
+ end
72
+ end
73
+
74
+ def test_http_empty_content
75
+ ok = false
76
+ EM.run {
77
+ EM.start_server "127.0.0.1", 9701, EmptyContent
78
+ c = silent { EM::P::HttpClient.send :request, :host => "127.0.0.1", :port => 9701 }
79
+ c.callback {|result|
80
+ ok = true
81
+ EM.stop
82
+ }
83
+ }
84
+ assert ok
85
+ end
86
+
87
+
88
+ #---------------------------------------
89
+
90
+ class PostContent < EM::P::LineAndTextProtocol
91
+ def initialize *args
92
+ super
93
+ @lines = []
94
+ end
95
+ def receive_line line
96
+ if line.length > 0
97
+ @lines << line
98
+ else
99
+ process_headers
100
+ end
101
+ end
102
+ def receive_binary_data data
103
+ @post_content = data
104
+ send_response
105
+ end
106
+ def process_headers
107
+ if @lines.first =~ /\APOST ([^\s]+) HTTP\/1.1\Z/
108
+ @uri = $1.dup
109
+ else
110
+ raise "bad request"
111
+ end
112
+
113
+ @lines.each {|line|
114
+ if line =~ /\AContent-length:\s*(\d+)\Z/i
115
+ @content_length = $1.dup.to_i
116
+ elsif line =~ /\AContent-type:\s*(\d+)\Z/i
117
+ @content_type = $1.dup
118
+ end
119
+ }
120
+
121
+ raise "invalid content length" unless @content_length
122
+ set_binary_mode @content_length
123
+ end
124
+ def send_response
125
+ send_data "HTTP/1.1 200 ...\r\nConnection: close\r\nContent-length: 10\r\nContent-type: text/html\r\n\r\n0123456789"
126
+ close_connection_after_writing
127
+ end
128
+ end
129
+
130
+ # TODO, this is WRONG. The handler is asserting an HTTP 1.1 request, but the client
131
+ # is sending a 1.0 request. Gotta fix the client
132
+ def test_post
133
+ response = nil
134
+ EM.run {
135
+ EM.start_server Localhost, Localport, PostContent
136
+ setup_timeout(2)
137
+ c = silent { EM::P::HttpClient.request(
138
+ :host=>Localhost,
139
+ :port=>Localport,
140
+ :method=>:post,
141
+ :request=>"/aaa",
142
+ :content=>"XYZ",
143
+ :content_type=>"text/plain"
144
+ )}
145
+ c.callback {|r|
146
+ response = r
147
+ EM.stop
148
+ }
149
+ }
150
+
151
+ assert_equal( 200, response[:status] )
152
+ assert_equal( "0123456789", response[:content] )
153
+ end
154
+
155
+
156
+ # TODO, need a more intelligent cookie tester.
157
+ # In fact, this whole test-harness needs a beefier server implementation.
158
+ def test_cookie
159
+ ok = false
160
+ EM.run {
161
+ c = silent { EM::Protocols::HttpClient.send :request, :host => "www.google.com", :port => 80, :cookie=>"aaa=bbb" }
162
+ c.callback {|result|
163
+ ok = true;
164
+ EM.stop
165
+ }
166
+ c.errback {EM.stop}
167
+ }
168
+ assert ok
169
+ end
170
+
171
+ # We can tell the client to send an HTTP/1.0 request (default is 1.1).
172
+ # This is useful for suppressing chunked responses until those are working.
173
+ def test_version_1_0
174
+ ok = false
175
+ EM.run {
176
+ c = silent { EM::P::HttpClient.request(
177
+ :host => "www.google.com",
178
+ :port => 80,
179
+ :version => "1.0"
180
+ )}
181
+ c.callback {|result|
182
+ ok = true;
183
+ EM.stop
184
+ }
185
+ c.errback {EM.stop}
186
+ }
187
+ assert ok
188
+ end
189
+
190
+ #-----------------------------------------
191
+
192
+ # Test a server that returns chunked encoding
193
+ #
194
+ class ChunkedEncodingContent < EventMachine::Connection
195
+ def initialize *args
196
+ super
197
+ end
198
+ def receive_data data
199
+ send_data ["HTTP/1.1 200 OK",
200
+ "Server: nginx/0.7.67",
201
+ "Date: Sat, 23 Oct 2010 16:41:32 GMT",
202
+ "Content-Type: application/json",
203
+ "Transfer-Encoding: chunked",
204
+ "Connection: keep-alive",
205
+ "",
206
+ "1800",
207
+ "chunk1" * 1024,
208
+ "5a",
209
+ "chunk2" * 15,
210
+ "0",
211
+ ""].join("\r\n")
212
+ close_connection_after_writing
213
+ end
214
+ end
215
+
216
+ def test_http_chunked_encoding_content
217
+ ok = false
218
+ EventMachine.run {
219
+ EventMachine.start_server "127.0.0.1", 9701, ChunkedEncodingContent
220
+ c = EventMachine::Protocols::HttpClient.send :request, :host => "127.0.0.1", :port => 9701
221
+ c.callback {|result|
222
+ if result[:content] == "chunk1" * 1024 + "chunk2" * 15
223
+ ok = true
224
+ end
225
+ EventMachine.stop
226
+ }
227
+ }
228
+ assert ok
229
+ end
230
+
231
+ end
232
+
233
+
@@ -0,0 +1,128 @@
1
+ require 'em_test_helper'
2
+
3
+ class TestHttpClient2 < Test::Unit::TestCase
4
+ Localhost = "127.0.0.1"
5
+ Localport = 9801
6
+
7
+ def setup
8
+ end
9
+
10
+ def teardown
11
+ end
12
+
13
+
14
+ class TestServer < EM::Connection
15
+ end
16
+
17
+ # #connect returns an object which has made a connection to an HTTP server
18
+ # and exposes methods for making HTTP requests on that connection.
19
+ # #connect can take either a pair of parameters (a host and a port),
20
+ # or a single parameter which is a Hash.
21
+ #
22
+ def test_connect
23
+ EM.run {
24
+ EM.start_server Localhost, Localport, TestServer
25
+ silent do
26
+ EM::P::HttpClient2.connect Localhost, Localport
27
+ EM::P::HttpClient2.connect( :host=>Localhost, :port=>Localport )
28
+ end
29
+ EM.stop
30
+ }
31
+ end
32
+
33
+
34
+ def test_bad_port
35
+ EM.run {
36
+ EM.start_server Localhost, Localport, TestServer
37
+ assert_raises( ArgumentError ) {
38
+ silent { EM::P::HttpClient2.connect Localhost, "xxx" }
39
+ }
40
+ EM.stop
41
+ }
42
+ end
43
+
44
+ def test_bad_server
45
+ err = nil
46
+ EM.run {
47
+ http = silent { EM::P::HttpClient2.connect Localhost, 9999 }
48
+ d = http.get "/"
49
+ d.errback { err = true; d.internal_error; EM.stop }
50
+ }
51
+ assert(err)
52
+ end
53
+
54
+ def test_get
55
+ content = nil
56
+ EM.run {
57
+ http = silent { EM::P::HttpClient2.connect "google.com", 80 }
58
+ d = http.get "/"
59
+ d.callback {
60
+ content = d.content
61
+ EM.stop
62
+ }
63
+ }
64
+ assert(content)
65
+ end
66
+
67
+ # Not a pipelined request because we wait for one response before we request the next.
68
+ # XXX this test is broken because it sends the second request to the first connection
69
+ # XXX right before the connection closes
70
+ def _test_get_multiple
71
+ content = nil
72
+ EM.run {
73
+ http = silent { EM::P::HttpClient2.connect "google.com", 80 }
74
+ d = http.get "/"
75
+ d.callback {
76
+ e = http.get "/"
77
+ e.callback {
78
+ content = e.content
79
+ EM.stop
80
+ }
81
+ }
82
+ }
83
+ assert(content)
84
+ end
85
+
86
+ def test_get_pipeline
87
+ headers, headers2 = nil, nil
88
+ EM.run {
89
+ http = silent { EM::P::HttpClient2.connect "google.com", 80 }
90
+ d = http.get("/")
91
+ d.callback {
92
+ headers = d.headers
93
+ }
94
+ e = http.get("/")
95
+ e.callback {
96
+ headers2 = e.headers
97
+ }
98
+ EM.tick_loop { EM.stop if headers && headers2 }
99
+ EM.add_timer(1) { EM.stop }
100
+ }
101
+ assert(headers)
102
+ assert(headers2)
103
+ end
104
+
105
+
106
+ def test_authheader
107
+ EM.run {
108
+ EM.start_server Localhost, Localport, TestServer
109
+ http = silent { EM::P::HttpClient2.connect Localhost, 18842 }
110
+ d = http.get :url=>"/", :authorization=>"Basic xxx"
111
+ d.callback {EM.stop}
112
+ d.errback {EM.stop}
113
+ }
114
+ end
115
+
116
+ def test_https_get
117
+ d = nil
118
+ EM.run {
119
+ http = silent { EM::P::HttpClient2.connect :host => 'www.apple.com', :port => 443, :ssl => true }
120
+ d = http.get "/"
121
+ d.callback {
122
+ EM.stop
123
+ }
124
+ }
125
+ assert_equal(200, d.status)
126
+ end if EM.ssl?
127
+
128
+ end