eventmachine-eventmachine 0.12.3 → 0.12.4
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.
- data/Rakefile +31 -9
- data/ext/cmain.cpp +23 -9
- data/ext/ed.cpp +40 -24
- data/ext/ed.h +9 -2
- data/ext/em.cpp +28 -6
- data/ext/em.h +7 -0
- data/ext/extconf.rb +1 -1
- data/ext/fastfilereader/extconf.rb +161 -0
- data/ext/fastfilereader/mapper.cpp +202 -0
- data/ext/fastfilereader/mapper.h +59 -0
- data/ext/fastfilereader/rubymain.cpp +127 -0
- data/ext/pipe.cpp +13 -6
- data/ext/rubymain.cpp +49 -0
- data/lib/eventmachine.rb +9 -4
- data/lib/eventmachine_version.rb +1 -1
- data/lib/protocols/httpcli2.rb +4 -4
- data/lib/protocols/line_and_text.rb +5 -1
- data/lib/protocols/linetext2.rb +11 -13
- data/lib/protocols/stomp.rb +23 -0
- data/tests/test_epoll.rb +3 -1
- data/tests/test_httpclient2.rb +27 -5
- data/tests/test_ltp.rb +0 -4
- data/tests/test_send_file.rb +0 -2
- data/tests/test_smtpclient.rb +45 -43
- metadata +7 -2
data/lib/eventmachine.rb
CHANGED
@@ -384,7 +384,6 @@ module EventMachine
|
|
384
384
|
def EventMachine::cancel_timer signature
|
385
385
|
@timers[signature] = proc{} if @timers.has_key?(signature)
|
386
386
|
end
|
387
|
-
private_class_method :cancel_timer
|
388
387
|
|
389
388
|
|
390
389
|
# stop_event_loop may called from within a callback method
|
@@ -1105,7 +1104,7 @@ module EventMachine
|
|
1105
1104
|
#--
|
1106
1105
|
# Perhaps misnamed since the underlying function uses socketpair and is full-duplex.
|
1107
1106
|
#
|
1108
|
-
def self::popen cmd, handler=nil
|
1107
|
+
def self::popen cmd, handler=nil, *args
|
1109
1108
|
klass = if (handler and handler.is_a?(Class))
|
1110
1109
|
handler
|
1111
1110
|
else
|
@@ -1115,7 +1114,7 @@ module EventMachine
|
|
1115
1114
|
w = Shellwords::shellwords( cmd )
|
1116
1115
|
w.unshift( w.first ) if w.first
|
1117
1116
|
s = invoke_popen( w )
|
1118
|
-
c = klass.new s
|
1117
|
+
c = klass.new s, *args
|
1119
1118
|
@conns[s] = c
|
1120
1119
|
yield(c) if block_given?
|
1121
1120
|
c
|
@@ -1382,6 +1381,10 @@ class Connection
|
|
1382
1381
|
def initialize(*args) #:nodoc:
|
1383
1382
|
end
|
1384
1383
|
|
1384
|
+
def associate_callback_target(sig) #:nodoc:
|
1385
|
+
# no-op for the time being, to match similar no-op in rubymain.cpp
|
1386
|
+
end
|
1387
|
+
|
1385
1388
|
# EventMachine::Connection#post_init is called by the event loop
|
1386
1389
|
# immediately after the network connection has been established,
|
1387
1390
|
# and before resumption of the network loop.
|
@@ -1500,7 +1503,9 @@ class Connection
|
|
1500
1503
|
# connection objects. (Need an example to make that clear.)
|
1501
1504
|
#
|
1502
1505
|
def send_data data
|
1503
|
-
|
1506
|
+
size = data.bytesize if data.respond_to?(:bytesize)
|
1507
|
+
size ||= data.size
|
1508
|
+
EventMachine::send_data @signature, data, size
|
1504
1509
|
end
|
1505
1510
|
|
1506
1511
|
# Returns true if the connection is in an error state, false otherwise.
|
data/lib/eventmachine_version.rb
CHANGED
data/lib/protocols/httpcli2.rb
CHANGED
@@ -129,12 +129,12 @@ module Protocols
|
|
129
129
|
if chunksize > 0
|
130
130
|
@conn.set_text_mode(ln.to_i(16))
|
131
131
|
else
|
132
|
-
@content = @content.join
|
132
|
+
@content = @content ? @content.join : ''
|
133
133
|
@chunk_trailer = true
|
134
134
|
end
|
135
135
|
else
|
136
136
|
# We correctly come here after each chunk gets read.
|
137
|
-
p "Got A BLANK chunk line"
|
137
|
+
# p "Got A BLANK chunk line"
|
138
138
|
end
|
139
139
|
|
140
140
|
end
|
@@ -144,7 +144,7 @@ module Protocols
|
|
144
144
|
# We get a single chunk. Append it to the incoming content and switch back to line mode.
|
145
145
|
#
|
146
146
|
def receive_chunked_text text
|
147
|
-
p "RECEIVED #{text.length} CHUNK"
|
147
|
+
# p "RECEIVED #{text.length} CHUNK"
|
148
148
|
(@content ||= []) << text
|
149
149
|
end
|
150
150
|
|
@@ -234,7 +234,7 @@ module Protocols
|
|
234
234
|
|
235
235
|
h,prt,ssl = args[:host], Integer(args[:port]), (args[:tls] || args[:ssl])
|
236
236
|
conn = EM.connect( h, prt, self )
|
237
|
-
|
237
|
+
conn.start_tls if ssl
|
238
238
|
conn.set_default_host_header( h, prt, ssl )
|
239
239
|
conn
|
240
240
|
end
|
@@ -27,7 +27,11 @@ require File.dirname(__FILE__) + '/buftok'
|
|
27
27
|
|
28
28
|
module EventMachine
|
29
29
|
module Protocols
|
30
|
-
|
30
|
+
# A protocol that handles line-oriented data with interspersed binary text.
|
31
|
+
#
|
32
|
+
# This version is optimized for performance. See EventMachine::Protocols::LineText2
|
33
|
+
# for a version which is optimized for correctness with regard to binary text blocks
|
34
|
+
# that can switch back to line mode.
|
31
35
|
class LineAndTextProtocol < Connection
|
32
36
|
MaxLineLength = 16*1024
|
33
37
|
MaxBinaryLength = 32*1024*1024
|
data/lib/protocols/linetext2.rb
CHANGED
@@ -24,22 +24,20 @@
|
|
24
24
|
#
|
25
25
|
#
|
26
26
|
|
27
|
-
|
28
|
-
# In the grand, time-honored tradition of re-inventing the wheel, we offer
|
29
|
-
# here YET ANOTHER protocol that handles line-oriented data with interspersed
|
30
|
-
# binary text. This one trades away some of the performance optimizations of
|
31
|
-
# EventMachine::Protocols::LineAndTextProtocol in order to get better correctness
|
32
|
-
# with regard to binary text blocks that can switch back to line mode. It also
|
33
|
-
# permits the line-delimiter to change in midstream.
|
34
|
-
# This was originally written to support Stomp.
|
35
|
-
|
36
|
-
# TODO! We're not enforcing the limits on header lengths and text-lengths.
|
37
|
-
# When we get around to that, call #receive_error if the user defined it, otherwise
|
38
|
-
# throw exceptions.
|
39
|
-
|
40
27
|
module EventMachine
|
41
28
|
module Protocols
|
29
|
+
# In the grand, time-honored tradition of re-inventing the wheel, we offer
|
30
|
+
# here YET ANOTHER protocol that handles line-oriented data with interspersed
|
31
|
+
# binary text. This one trades away some of the performance optimizations of
|
32
|
+
# EventMachine::Protocols::LineAndTextProtocol in order to get better correctness
|
33
|
+
# with regard to binary text blocks that can switch back to line mode. It also
|
34
|
+
# permits the line-delimiter to change in midstream.
|
35
|
+
# This was originally written to support Stomp.
|
42
36
|
module LineText2
|
37
|
+
# TODO! We're not enforcing the limits on header lengths and text-lengths.
|
38
|
+
# When we get around to that, call #receive_error if the user defined it, otherwise
|
39
|
+
# throw exceptions.
|
40
|
+
|
43
41
|
MaxLineLength = 16*1024
|
44
42
|
MaxBinaryLength = 32*1024*1024
|
45
43
|
|
data/lib/protocols/stomp.rb
CHANGED
@@ -31,6 +31,29 @@ module EventMachine
|
|
31
31
|
|
32
32
|
# Implements Stomp (http://docs.codehaus.org/display/STOMP/Protocol).
|
33
33
|
#
|
34
|
+
# == Usage example
|
35
|
+
#
|
36
|
+
# class StompClient < EM::Connection
|
37
|
+
# include EM::Protocols::Stomp
|
38
|
+
#
|
39
|
+
# def connection_completed
|
40
|
+
# connect :login => 'guest', :passcode => 'guest'
|
41
|
+
# end
|
42
|
+
#
|
43
|
+
# def receive_msg msg
|
44
|
+
# if msg.command == "CONNECTED"
|
45
|
+
# subscribe '/some/topic'
|
46
|
+
# else
|
47
|
+
# p ['got a message', msg]
|
48
|
+
# puts msg.body
|
49
|
+
# end
|
50
|
+
# end
|
51
|
+
# end
|
52
|
+
#
|
53
|
+
# EM.run{
|
54
|
+
# EM.connect 'localhost', 61613, StompClient
|
55
|
+
# }
|
56
|
+
#
|
34
57
|
module Stomp
|
35
58
|
include LineText2
|
36
59
|
|
data/tests/test_epoll.rb
CHANGED
@@ -132,6 +132,7 @@ class TestEpoll < Test::Unit::TestCase
|
|
132
132
|
|
133
133
|
|
134
134
|
def test_unix_domain
|
135
|
+
fn = "/tmp/xxx.chain"
|
135
136
|
EM.epoll
|
136
137
|
s = EM.set_descriptor_table_size 60000
|
137
138
|
EM.run {
|
@@ -143,7 +144,6 @@ class TestEpoll < Test::Unit::TestCase
|
|
143
144
|
# Let's not sweat the Unix-ness of the filename, since this test can't possibly
|
144
145
|
# work on Windows anyway.
|
145
146
|
#
|
146
|
-
fn = "/tmp/xxx.chain"
|
147
147
|
File.unlink(fn) if File.exist?(fn)
|
148
148
|
EM.start_unix_domain_server fn, TestEchoServer
|
149
149
|
$n = 0
|
@@ -155,6 +155,8 @@ class TestEpoll < Test::Unit::TestCase
|
|
155
155
|
}
|
156
156
|
assert_equal(0, $n)
|
157
157
|
assert_equal(50, $max)
|
158
|
+
ensure
|
159
|
+
File.unlink(fn) if File.exist?(fn)
|
158
160
|
end
|
159
161
|
|
160
162
|
end
|
data/tests/test_httpclient2.rb
CHANGED
@@ -68,52 +68,61 @@ class TestHttpClient2 < Test::Unit::TestCase
|
|
68
68
|
end
|
69
69
|
|
70
70
|
def test_bad_server
|
71
|
+
err = nil
|
71
72
|
EM.run {
|
72
73
|
http = EM::P::HttpClient2.connect Localhost, 9999
|
73
74
|
d = http.get "/"
|
74
|
-
d.errback {
|
75
|
+
d.errback { err = true; d.internal_error; EM.stop }
|
75
76
|
}
|
77
|
+
assert(err)
|
76
78
|
end
|
77
79
|
|
78
80
|
def test_get
|
81
|
+
content = nil
|
79
82
|
EM.run {
|
80
83
|
http = EM::P::HttpClient2.connect "www.bayshorenetworks.com", 80
|
81
84
|
d = http.get "/"
|
82
85
|
d.callback {
|
83
|
-
|
86
|
+
content = d.content
|
84
87
|
EM.stop
|
85
88
|
}
|
86
89
|
}
|
90
|
+
assert(content)
|
87
91
|
end
|
88
92
|
|
89
93
|
# Not a pipelined request because we wait for one response before we request the next.
|
90
94
|
def test_get_multiple
|
95
|
+
content = nil
|
91
96
|
EM.run {
|
92
97
|
http = EM::P::HttpClient2.connect "www.bayshorenetworks.com", 80
|
93
98
|
d = http.get "/"
|
94
99
|
d.callback {
|
95
100
|
e = http.get "/"
|
96
101
|
e.callback {
|
97
|
-
|
102
|
+
content = e.content
|
98
103
|
EM.stop
|
99
104
|
}
|
100
105
|
}
|
101
106
|
}
|
107
|
+
assert(content)
|
102
108
|
end
|
103
109
|
|
104
110
|
def test_get_pipeline
|
111
|
+
headers, headers2 = nil, nil
|
105
112
|
EM.run {
|
106
113
|
http = EM::P::HttpClient2.connect "www.microsoft.com", 80
|
107
114
|
d = http.get("/")
|
108
115
|
d.callback {
|
109
|
-
|
116
|
+
headers = d.headers
|
110
117
|
}
|
111
118
|
e = http.get("/")
|
112
119
|
e.callback {
|
113
|
-
|
120
|
+
headers2 = e.headers
|
114
121
|
}
|
115
122
|
EM::Timer.new(1) {EM.stop}
|
116
123
|
}
|
124
|
+
assert(headers)
|
125
|
+
assert(headers2)
|
117
126
|
end
|
118
127
|
|
119
128
|
|
@@ -126,6 +135,19 @@ class TestHttpClient2 < Test::Unit::TestCase
|
|
126
135
|
d.errback {EM.stop}
|
127
136
|
}
|
128
137
|
end
|
138
|
+
|
139
|
+
def test_https_get
|
140
|
+
d = nil
|
141
|
+
EM.run {
|
142
|
+
http = EM::P::HttpClient2.connect :host => 'www.amazon.com', :port => 443, :ssl => true
|
143
|
+
d = http.get "/"
|
144
|
+
d.callback {
|
145
|
+
EM.stop
|
146
|
+
}
|
147
|
+
}
|
148
|
+
assert_equal(200, d.status)
|
149
|
+
end
|
150
|
+
|
129
151
|
|
130
152
|
|
131
153
|
end
|
data/tests/test_ltp.rb
CHANGED
@@ -62,7 +62,6 @@ class TestLineAndTextProtocol < Test::Unit::TestCase
|
|
62
62
|
assert( RUBY_PLATFORM !~ /java/ )
|
63
63
|
|
64
64
|
lines_received = []
|
65
|
-
Thread.abort_on_exception = true
|
66
65
|
EventMachine.run {
|
67
66
|
EventMachine.start_server( TestHost, TestPort, SimpleLineTest ) do |conn|
|
68
67
|
conn.instance_eval "@line_buffer = lines_received"
|
@@ -90,7 +89,6 @@ class TestLineAndTextProtocol < Test::Unit::TestCase
|
|
90
89
|
assert( RUBY_PLATFORM !~ /java/ )
|
91
90
|
|
92
91
|
lines_received = []
|
93
|
-
Thread.abort_on_exception = true
|
94
92
|
EventMachine.run {
|
95
93
|
EventMachine.start_server( TestHost, TestPort, SimpleLineTest ) do |conn|
|
96
94
|
conn.instance_eval "@error_message = lines_received"
|
@@ -130,7 +128,6 @@ class TestLineAndTextProtocol < Test::Unit::TestCase
|
|
130
128
|
output = ''
|
131
129
|
lines_received = []
|
132
130
|
text_received = []
|
133
|
-
Thread.abort_on_exception = true
|
134
131
|
EventMachine.run {
|
135
132
|
EventMachine.start_server( TestHost, TestPort, LineAndTextTest ) do |conn|
|
136
133
|
conn.instance_eval "@lines = lines_received; @text = text_received"
|
@@ -171,7 +168,6 @@ class TestLineAndTextProtocol < Test::Unit::TestCase
|
|
171
168
|
output = ''
|
172
169
|
lines_received = []
|
173
170
|
text_received = []
|
174
|
-
Thread.abort_on_exception = true
|
175
171
|
EventMachine.run {
|
176
172
|
EventMachine.start_server( TestHost, TestPort, BinaryTextTest ) do |conn|
|
177
173
|
conn.instance_eval "@lines = lines_received; @text = text_received"
|
data/tests/test_send_file.rb
CHANGED
@@ -188,7 +188,6 @@ class TestSendFile < Test::Unit::TestCase
|
|
188
188
|
begin
|
189
189
|
require 'fastfilereaderext'
|
190
190
|
rescue LoadError
|
191
|
-
$stderr.puts "no fastfilereaderext, not running test_stream_large_file_data"
|
192
191
|
return
|
193
192
|
end
|
194
193
|
File.open( TestFilename, "w" ) {|f|
|
@@ -214,7 +213,6 @@ class TestSendFile < Test::Unit::TestCase
|
|
214
213
|
begin
|
215
214
|
require 'fastfilereaderext'
|
216
215
|
rescue LoadError
|
217
|
-
$stderr.puts "no fastfilereaderext, not running test_stream_large_chunked_file_data"
|
218
216
|
return
|
219
217
|
end
|
220
218
|
File.open( TestFilename, "w" ) {|f|
|
data/tests/test_smtpclient.rb
CHANGED
@@ -30,52 +30,54 @@ require 'test/unit'
|
|
30
30
|
|
31
31
|
class TestSmtpClient < Test::Unit::TestCase
|
32
32
|
|
33
|
-
|
34
|
-
|
33
|
+
Localhost = "127.0.0.1"
|
34
|
+
Localport = 9801
|
35
35
|
|
36
|
-
|
37
|
-
|
36
|
+
def setup
|
37
|
+
end
|
38
38
|
|
39
|
-
|
40
|
-
|
39
|
+
def teardown
|
40
|
+
end
|
41
41
|
|
42
|
-
|
43
|
-
|
44
|
-
|
42
|
+
def test_a
|
43
|
+
# No real tests until we have a server implementation to test against.
|
44
|
+
# This is what the call looks like, though:
|
45
|
+
err = nil
|
46
|
+
EM.run {
|
47
|
+
d = EM::Protocols::SmtpClient.send :domain=>"example.com",
|
48
|
+
:host=>Localhost,
|
49
|
+
:port=>Localport, # optional, defaults 25
|
50
|
+
:starttls=>true,
|
51
|
+
:from=>"sender@example.com",
|
52
|
+
:to=> ["to_1@example.com", "to_2@example.com"],
|
53
|
+
:header=> {"Subject" => "This is a subject line"},
|
54
|
+
:body=> "This is the body of the email",
|
55
|
+
:verbose=>true
|
56
|
+
d.errback {|e|
|
57
|
+
err = e
|
58
|
+
EM.stop
|
59
|
+
}
|
60
|
+
}
|
61
|
+
assert(err)
|
62
|
+
end
|
45
63
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
EM.run {
|
66
|
-
d = EM::Protocols::SmtpClient.send :domain=>"example.com",
|
67
|
-
:host=>Localhost,
|
68
|
-
:port=>Localport, # optional, defaults 25
|
69
|
-
:starttls=>true,
|
70
|
-
:from=>"sender@example.com",
|
71
|
-
:to=> ["to_1@example.com", "to_2@example.com"],
|
72
|
-
:content => ["Subject: xxx\r\n\r\ndata\r\n.\r\n"],
|
73
|
-
:verbose=>true
|
74
|
-
d.errback {|e|
|
75
|
-
p e
|
76
|
-
EM.stop
|
77
|
-
}
|
78
|
-
}
|
79
|
-
end
|
64
|
+
def test_content
|
65
|
+
err = nil
|
66
|
+
EM.run {
|
67
|
+
d = EM::Protocols::SmtpClient.send :domain=>"example.com",
|
68
|
+
:host=>Localhost,
|
69
|
+
:port=>Localport, # optional, defaults 25
|
70
|
+
:starttls=>true,
|
71
|
+
:from=>"sender@example.com",
|
72
|
+
:to=> ["to_1@example.com", "to_2@example.com"],
|
73
|
+
:content => ["Subject: xxx\r\n\r\ndata\r\n.\r\n"],
|
74
|
+
:verbose=>true
|
75
|
+
d.errback {|e|
|
76
|
+
err = e
|
77
|
+
EM.stop
|
78
|
+
}
|
79
|
+
}
|
80
|
+
assert(err)
|
81
|
+
end
|
80
82
|
|
81
83
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: eventmachine-eventmachine
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.12.
|
4
|
+
version: 0.12.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Francis Cianfrocca
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date:
|
12
|
+
date: 2009-02-08 00:00:00 -08:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -112,6 +112,11 @@ files:
|
|
112
112
|
- ext/eventmachine.h
|
113
113
|
- ext/eventmachine_cpp.h
|
114
114
|
- ext/extconf.rb
|
115
|
+
- ext/fastfilereader
|
116
|
+
- ext/fastfilereader/extconf.rb
|
117
|
+
- ext/fastfilereader/mapper.cpp
|
118
|
+
- ext/fastfilereader/mapper.h
|
119
|
+
- ext/fastfilereader/rubymain.cpp
|
115
120
|
- ext/files.cpp
|
116
121
|
- ext/files.h
|
117
122
|
- ext/kb.cpp
|