em-websocket 0.1.4 → 0.2.0
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/Gemfile +3 -0
- data/README.md +76 -0
- data/Rakefile +6 -28
- data/lib/em-websocket.rb +6 -2
- data/lib/em-websocket/connection.rb +53 -112
- data/lib/em-websocket/framing03.rb +176 -0
- data/lib/em-websocket/framing76.rb +96 -0
- data/lib/em-websocket/handler.rb +28 -4
- data/lib/em-websocket/handler03.rb +14 -0
- data/lib/em-websocket/handler75.rb +2 -15
- data/lib/em-websocket/handler76.rb +3 -56
- data/lib/em-websocket/handler_factory.rb +37 -12
- data/lib/em-websocket/handshake75.rb +21 -0
- data/lib/em-websocket/handshake76.rb +61 -0
- data/lib/em-websocket/version.rb +5 -0
- data/spec/helper.rb +12 -7
- data/spec/integration/draft03_spec.rb +252 -0
- data/spec/integration/{integration_spec.rb → draft76_spec.rb} +26 -1
- data/spec/unit/framing_spec.rb +108 -0
- data/spec/unit/handler_spec.rb +12 -0
- data/spec/websocket_spec.rb +16 -1
- metadata +51 -17
- data/README.rdoc +0 -73
- data/VERSION +0 -1
- data/examples/srv.rb +0 -19
@@ -0,0 +1,252 @@
|
|
1
|
+
require 'spec/helper'
|
2
|
+
|
3
|
+
describe "draft03" do
|
4
|
+
before :each do
|
5
|
+
@request = {
|
6
|
+
:port => 80,
|
7
|
+
:method => "GET",
|
8
|
+
:path => "/demo",
|
9
|
+
:headers => {
|
10
|
+
'Host' => 'example.com',
|
11
|
+
'Connection' => 'Upgrade',
|
12
|
+
'Sec-WebSocket-Key2' => '12998 5 Y3 1 .P00',
|
13
|
+
'Sec-WebSocket-Protocol' => 'sample',
|
14
|
+
'Upgrade' => 'WebSocket',
|
15
|
+
'Sec-WebSocket-Key1' => '4 @1 46546xW%0l 1 5',
|
16
|
+
'Origin' => 'http://example.com',
|
17
|
+
'Sec-WebSocket-Draft' => '3'
|
18
|
+
},
|
19
|
+
:body => '^n:ds[4U'
|
20
|
+
}
|
21
|
+
|
22
|
+
@response = {
|
23
|
+
:headers => {
|
24
|
+
"Upgrade" => "WebSocket",
|
25
|
+
"Connection" => "Upgrade",
|
26
|
+
"Sec-WebSocket-Location" => "ws://example.com/demo",
|
27
|
+
"Sec-WebSocket-Origin" => "http://example.com",
|
28
|
+
"Sec-WebSocket-Protocol" => "sample"
|
29
|
+
},
|
30
|
+
:body => "8jKS\'y:G*Co,Wxa-"
|
31
|
+
}
|
32
|
+
end
|
33
|
+
|
34
|
+
# These examples are straight from the spec
|
35
|
+
# http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-03#section-4.6
|
36
|
+
describe "examples from the spec" do
|
37
|
+
it "should accept a single-frame text message" do
|
38
|
+
EM.run do
|
39
|
+
EM::WebSocket.start(:host => "0.0.0.0", :port => 12345) { |ws|
|
40
|
+
ws.onmessage { |msg|
|
41
|
+
msg.should == 'Hello'
|
42
|
+
EM.stop
|
43
|
+
}
|
44
|
+
}
|
45
|
+
|
46
|
+
# Create a fake client which sends draft 76 handshake
|
47
|
+
connection = EM.connect('0.0.0.0', 12345, FakeWebSocketClient)
|
48
|
+
connection.send_data(format_request(@request))
|
49
|
+
|
50
|
+
# Send frame
|
51
|
+
connection.onopen = lambda {
|
52
|
+
connection.send_data("\x04\x05Hello")
|
53
|
+
}
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
it "should accept a fragmented text message" do
|
58
|
+
EM.run do
|
59
|
+
EM::WebSocket.start(:host => "0.0.0.0", :port => 12345) { |ws|
|
60
|
+
ws.onmessage { |msg|
|
61
|
+
msg.should == 'Hello'
|
62
|
+
EM.stop
|
63
|
+
}
|
64
|
+
}
|
65
|
+
|
66
|
+
# Create a fake client which sends draft 76 handshake
|
67
|
+
connection = EM.connect('0.0.0.0', 12345, FakeWebSocketClient)
|
68
|
+
connection.send_data(format_request(@request))
|
69
|
+
|
70
|
+
# Send frame
|
71
|
+
connection.onopen = lambda {
|
72
|
+
connection.send_data("\x84\x03Hel")
|
73
|
+
connection.send_data("\x00\x02lo")
|
74
|
+
}
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
it "should accept a ping request and respond with the same body" do
|
79
|
+
EM.run do
|
80
|
+
EM::WebSocket.start(:host => "0.0.0.0", :port => 12345) { |ws| }
|
81
|
+
|
82
|
+
# Create a fake client which sends draft 76 handshake
|
83
|
+
connection = EM.connect('0.0.0.0', 12345, FakeWebSocketClient)
|
84
|
+
connection.send_data(format_request(@request))
|
85
|
+
|
86
|
+
# Send frame
|
87
|
+
connection.onopen = lambda {
|
88
|
+
connection.send_data("\x02\x05Hello")
|
89
|
+
}
|
90
|
+
|
91
|
+
connection.onmessage = lambda { |frame|
|
92
|
+
next if frame.nil?
|
93
|
+
frame.should == "\x03\x05Hello"
|
94
|
+
EM.stop
|
95
|
+
}
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
it "should accept a 256 bytes binary message in a single frame" do
|
100
|
+
EM.run do
|
101
|
+
data = "a" * 256
|
102
|
+
|
103
|
+
EM::WebSocket.start(:host => "0.0.0.0", :port => 12345) { |ws|
|
104
|
+
ws.onmessage { |msg|
|
105
|
+
msg.should == data
|
106
|
+
EM.stop
|
107
|
+
}
|
108
|
+
}
|
109
|
+
|
110
|
+
# Create a fake client which sends draft 76 handshake
|
111
|
+
connection = EM.connect('0.0.0.0', 12345, FakeWebSocketClient)
|
112
|
+
connection.send_data(format_request(@request))
|
113
|
+
|
114
|
+
# Send frame
|
115
|
+
connection.onopen = lambda {
|
116
|
+
connection.send_data("\x05\x7E\x01\x00" + data)
|
117
|
+
}
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
it "should accept a 64KiB binary message in a single frame" do
|
122
|
+
EM.run do
|
123
|
+
data = "a" * 65536
|
124
|
+
|
125
|
+
EM::WebSocket.start(:host => "0.0.0.0", :port => 12345) { |ws|
|
126
|
+
ws.onmessage { |msg|
|
127
|
+
msg.should == data
|
128
|
+
EM.stop
|
129
|
+
}
|
130
|
+
}
|
131
|
+
|
132
|
+
# Create a fake client which sends draft 76 handshake
|
133
|
+
connection = EM.connect('0.0.0.0', 12345, FakeWebSocketClient)
|
134
|
+
connection.send_data(format_request(@request))
|
135
|
+
|
136
|
+
# Send frame
|
137
|
+
connection.onopen = lambda {
|
138
|
+
connection.send_data("\x05\x7F\x00\x00\x00\x00\x00\x01\x00\x00" + data)
|
139
|
+
}
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
describe "close handling" do
|
145
|
+
it "should respond to a new close frame with a close frame" do
|
146
|
+
EM.run do
|
147
|
+
EM::WebSocket.start(:host => "0.0.0.0", :port => 12345) { |ws| }
|
148
|
+
|
149
|
+
# Create a fake client which sends draft 76 handshake
|
150
|
+
connection = EM.connect('0.0.0.0', 12345, FakeWebSocketClient)
|
151
|
+
connection.send_data(format_request(@request))
|
152
|
+
|
153
|
+
# Send close frame
|
154
|
+
connection.onopen = lambda {
|
155
|
+
connection.send_data("\x01\x00")
|
156
|
+
}
|
157
|
+
|
158
|
+
# Check that close ack received
|
159
|
+
connection.onmessage = lambda { |frame|
|
160
|
+
frame.should == "\x01\x00"
|
161
|
+
EM.stop
|
162
|
+
}
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
it "should close the connection on receiving a close acknowlegement" do
|
167
|
+
EM.run do
|
168
|
+
ack_received = false
|
169
|
+
|
170
|
+
EM::WebSocket.start(:host => "0.0.0.0", :port => 12345) { |ws|
|
171
|
+
ws.onopen {
|
172
|
+
# 2. Send a close frame
|
173
|
+
EM.next_tick {
|
174
|
+
ws.close_websocket
|
175
|
+
}
|
176
|
+
}
|
177
|
+
}
|
178
|
+
|
179
|
+
# 1. Create a fake client which sends draft 76 handshake
|
180
|
+
connection = EM.connect('0.0.0.0', 12345, FakeWebSocketClient)
|
181
|
+
connection.send_data(format_request(@request))
|
182
|
+
|
183
|
+
# 3. Check that close frame recieved and acknowlege it
|
184
|
+
connection.onmessage = lambda { |frame|
|
185
|
+
frame.should == "\x01\x00"
|
186
|
+
ack_received = true
|
187
|
+
connection.send_data("\x01\x00")
|
188
|
+
}
|
189
|
+
|
190
|
+
# 4. Check that connection is closed _after_ the ack
|
191
|
+
connection.onclose = lambda {
|
192
|
+
ack_received.should == true
|
193
|
+
EM.stop
|
194
|
+
}
|
195
|
+
end
|
196
|
+
end
|
197
|
+
|
198
|
+
it "should not allow data fraome to be sent after close frame sent" do
|
199
|
+
EM.run {
|
200
|
+
EM::WebSocket.start(:host => "0.0.0.0", :port => 12345) { |ws|
|
201
|
+
ws.onopen {
|
202
|
+
# 2. Send a close frame
|
203
|
+
EM.next_tick {
|
204
|
+
ws.close_websocket
|
205
|
+
}
|
206
|
+
|
207
|
+
# 3. Check that exception raised if I attempt to send more data
|
208
|
+
EM.add_timer(0.1) {
|
209
|
+
lambda {
|
210
|
+
ws.send('hello world')
|
211
|
+
}.should raise_error(EM::WebSocket::WebSocketError, 'Cannot send data frame since connection is closing')
|
212
|
+
EM.stop
|
213
|
+
}
|
214
|
+
}
|
215
|
+
}
|
216
|
+
|
217
|
+
# 1. Create a fake client which sends draft 76 handshake
|
218
|
+
connection = EM.connect('0.0.0.0', 12345, FakeWebSocketClient)
|
219
|
+
connection.send_data(format_request(@request))
|
220
|
+
}
|
221
|
+
end
|
222
|
+
|
223
|
+
it "should still respond to control frames after close frame sent" do
|
224
|
+
EM.run {
|
225
|
+
EM::WebSocket.start(:host => "0.0.0.0", :port => 12345) { |ws|
|
226
|
+
ws.onopen {
|
227
|
+
# 2. Send a close frame
|
228
|
+
EM.next_tick {
|
229
|
+
ws.close_websocket
|
230
|
+
}
|
231
|
+
}
|
232
|
+
}
|
233
|
+
|
234
|
+
# 1. Create a fake client which sends draft 76 handshake
|
235
|
+
connection = EM.connect('0.0.0.0', 12345, FakeWebSocketClient)
|
236
|
+
connection.send_data(format_request(@request))
|
237
|
+
|
238
|
+
connection.onmessage = lambda { |frame|
|
239
|
+
if frame == "\x01\x00"
|
240
|
+
# 3. After the close frame is received send a ping frame, but
|
241
|
+
# don't respond with a close ack
|
242
|
+
connection.send_data("\x02\x05Hello")
|
243
|
+
else
|
244
|
+
# 4. Check that the pong is received
|
245
|
+
frame.should == "\x03\x05Hello"
|
246
|
+
EM.stop
|
247
|
+
end
|
248
|
+
}
|
249
|
+
}
|
250
|
+
end
|
251
|
+
end
|
252
|
+
end
|
@@ -161,7 +161,32 @@ describe "WebSocket server draft76" do
|
|
161
161
|
}
|
162
162
|
|
163
163
|
client = EM.connect('0.0.0.0', 12345, FakeWebSocketClient)
|
164
|
-
client.send_data("This is not a HTTP header")
|
164
|
+
client.send_data("This is not a HTTP header\r\n\r\n")
|
165
165
|
}
|
166
166
|
end
|
167
|
+
|
168
|
+
it "should handle handshake request split into two TCP packets" do
|
169
|
+
EM.run do
|
170
|
+
EM.add_timer(0.1) do
|
171
|
+
EventMachine::WebSocket.start(:host => "0.0.0.0", :port => 12345) { }
|
172
|
+
|
173
|
+
# Create a fake client which sends draft 76 handshake
|
174
|
+
connection = EM.connect('0.0.0.0', 12345, FakeWebSocketClient)
|
175
|
+
data = format_request(@request)
|
176
|
+
# Sends first half of the request
|
177
|
+
connection.send_data(data[0...(data.length / 2)])
|
178
|
+
|
179
|
+
connection.onopen = lambda {
|
180
|
+
connection.handshake_response.lines.sort.
|
181
|
+
should == format_response(@response).lines.sort
|
182
|
+
EM.stop
|
183
|
+
}
|
184
|
+
|
185
|
+
EM.add_timer(0.1) do
|
186
|
+
# Sends second half of the request
|
187
|
+
connection.send_data(data[(data.length / 2)..-1])
|
188
|
+
end
|
189
|
+
end
|
190
|
+
end
|
191
|
+
end
|
167
192
|
end
|
@@ -0,0 +1,108 @@
|
|
1
|
+
require 'spec/helper'
|
2
|
+
|
3
|
+
describe EM::WebSocket::Framing03 do
|
4
|
+
class FramingContainer
|
5
|
+
include EM::WebSocket::Framing03
|
6
|
+
|
7
|
+
def <<(data)
|
8
|
+
@data << data
|
9
|
+
process_data
|
10
|
+
end
|
11
|
+
|
12
|
+
def debug(*args); end
|
13
|
+
end
|
14
|
+
|
15
|
+
before :each do
|
16
|
+
@f = FramingContainer.new
|
17
|
+
@f.initialize_framing
|
18
|
+
end
|
19
|
+
|
20
|
+
describe "basic examples" do
|
21
|
+
it "connection close" do
|
22
|
+
@f.should_receive(:message).with(:close, '', '')
|
23
|
+
@f << 0b00000001
|
24
|
+
@f << 0b00000000
|
25
|
+
end
|
26
|
+
|
27
|
+
it "ping" do
|
28
|
+
@f.should_receive(:message).with(:ping, '', '')
|
29
|
+
@f << 0b00000010
|
30
|
+
@f << 0b00000000
|
31
|
+
end
|
32
|
+
|
33
|
+
it "pong" do
|
34
|
+
@f.should_receive(:message).with(:pong, '', '')
|
35
|
+
@f << 0b00000011
|
36
|
+
@f << 0b00000000
|
37
|
+
end
|
38
|
+
|
39
|
+
it "text" do
|
40
|
+
@f.should_receive(:message).with(:text, '', 'foo')
|
41
|
+
@f << 0b00000100
|
42
|
+
@f << 0b00000011
|
43
|
+
@f << 'foo'
|
44
|
+
end
|
45
|
+
|
46
|
+
it "Text in two frames" do
|
47
|
+
@f.should_receive(:message).with(:text, '', 'hello world')
|
48
|
+
@f << 0b10000100
|
49
|
+
@f << 0b00000110
|
50
|
+
@f << "hello "
|
51
|
+
@f << 0b00000000
|
52
|
+
@f << 0b00000101
|
53
|
+
@f << "world"
|
54
|
+
end
|
55
|
+
|
56
|
+
it "2 byte extended payload length text frame" do
|
57
|
+
data = 'a' * 256
|
58
|
+
@f.should_receive(:message).with(:text, '', data)
|
59
|
+
@f << 0b00000100 # Single frame, text
|
60
|
+
@f << 0b01111110 # Length 126 (so read 2 bytes)
|
61
|
+
@f << 0b00000001 # Two bytes in network byte order (256)
|
62
|
+
@f << 0b00000000
|
63
|
+
@f << data
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
# These examples are straight from the spec
|
68
|
+
# http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-03#section-4.6
|
69
|
+
describe "examples from the spec" do
|
70
|
+
it "a single-frame text message" do
|
71
|
+
@f.should_receive(:message).with(:text, '', 'Hello')
|
72
|
+
@f << "\x04\x05Hello"
|
73
|
+
end
|
74
|
+
|
75
|
+
it "a fragmented text message" do
|
76
|
+
@f.should_receive(:message).with(:text, '', 'Hello')
|
77
|
+
@f << "\x84\x03Hel"
|
78
|
+
@f << "\x00\x02lo"
|
79
|
+
end
|
80
|
+
|
81
|
+
it "Ping request and response" do
|
82
|
+
@f.should_receive(:message).with(:ping, '', 'Hello')
|
83
|
+
@f << "\x02\x05Hello"
|
84
|
+
end
|
85
|
+
|
86
|
+
it "256 bytes binary message in a single frame" do
|
87
|
+
data = "a"*256
|
88
|
+
@f.should_receive(:message).with(:binary, '', data)
|
89
|
+
@f << "\x05\x7E\x01\x00" + data
|
90
|
+
end
|
91
|
+
|
92
|
+
it "64KiB binary message in a single frame" do
|
93
|
+
data = "a"*65536
|
94
|
+
@f.should_receive(:message).with(:binary, '', data)
|
95
|
+
@f << "\x05\x7F\x00\x00\x00\x00\x00\x01\x00\x00" + data
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
describe "error cases" do
|
100
|
+
it "should raise an exception on continuation frame without preceeding more frame" do
|
101
|
+
lambda {
|
102
|
+
@f << 0b00000000 # Single frame, continuation
|
103
|
+
@f << 0b00000001 # Length 1
|
104
|
+
@f << 'f'
|
105
|
+
}.should raise_error(EM::WebSocket::WebSocketError, 'Continuation frame not expected')
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
data/spec/unit/handler_spec.rb
CHANGED
@@ -124,4 +124,16 @@ describe "EventMachine::WebSocket::Handler" do
|
|
124
124
|
}.should raise_error(EM::WebSocket::HandshakeError, 'Websocket Key1 or Key2 does not contain spaces - this is a symptom of a cross-protocol attack')
|
125
125
|
end
|
126
126
|
end
|
127
|
+
|
128
|
+
it "should leave request with incomplete header" do
|
129
|
+
data = format_request(@request)
|
130
|
+
# Sends only half of the request
|
131
|
+
EM::WebSocket::HandlerFactory.build(mock(EM::WebSocket::Connection), data[0...(data.length / 2)]).should == nil
|
132
|
+
end
|
133
|
+
|
134
|
+
it "should leave request with incomplete third key" do
|
135
|
+
data = format_request(@request)
|
136
|
+
# Removes last two bytes of the third key
|
137
|
+
EM::WebSocket::HandlerFactory.build(mock(EM::WebSocket::Connection), data[0...(data.length - 2)]).should == nil
|
138
|
+
end
|
127
139
|
end
|
data/spec/websocket_spec.rb
CHANGED
@@ -190,4 +190,19 @@ describe EventMachine::WebSocket do
|
|
190
190
|
end
|
191
191
|
end
|
192
192
|
|
193
|
-
|
193
|
+
it "should raise an exception if frame sent before handshake complete" do
|
194
|
+
EM.run {
|
195
|
+
EventMachine::WebSocket.start(:host => "0.0.0.0", :port => 12345) { |c|
|
196
|
+
# We're not using a real client so the handshake will not be sent
|
197
|
+
EM.add_timer(0.1) {
|
198
|
+
lambda {
|
199
|
+
c.send('early message')
|
200
|
+
}.should raise_error('Cannot send data before onopen callback')
|
201
|
+
EM.stop
|
202
|
+
}
|
203
|
+
}
|
204
|
+
|
205
|
+
client = EM.connect('0.0.0.0', 12345, EM::Connection)
|
206
|
+
}
|
207
|
+
end
|
208
|
+
end
|
metadata
CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 0
|
7
|
-
-
|
8
|
-
-
|
9
|
-
version: 0.
|
7
|
+
- 2
|
8
|
+
- 0
|
9
|
+
version: 0.2.0
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Ilya Grigorik
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-
|
17
|
+
date: 2010-11-23 00:00:00 +00:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -50,7 +50,7 @@ dependencies:
|
|
50
50
|
prerelease: false
|
51
51
|
requirement: &id003 !ruby/object:Gem::Requirement
|
52
52
|
requirements:
|
53
|
-
- -
|
53
|
+
- - ~>
|
54
54
|
- !ruby/object:Gem::Version
|
55
55
|
segments:
|
56
56
|
- 0
|
@@ -59,20 +59,47 @@ dependencies:
|
|
59
59
|
version: 0.2.6
|
60
60
|
type: :development
|
61
61
|
version_requirements: *id003
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: rspec
|
64
|
+
prerelease: false
|
65
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - ~>
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
segments:
|
70
|
+
- 2
|
71
|
+
- 0
|
72
|
+
- 0
|
73
|
+
version: 2.0.0
|
74
|
+
type: :development
|
75
|
+
version_requirements: *id004
|
76
|
+
- !ruby/object:Gem::Dependency
|
77
|
+
name: rake
|
78
|
+
prerelease: false
|
79
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
80
|
+
requirements:
|
81
|
+
- - ">="
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
segments:
|
84
|
+
- 0
|
85
|
+
version: "0"
|
86
|
+
type: :development
|
87
|
+
version_requirements: *id005
|
62
88
|
description: EventMachine based WebSocket server
|
63
|
-
email:
|
89
|
+
email:
|
90
|
+
- ilya@igvita.com
|
64
91
|
executables: []
|
65
92
|
|
66
93
|
extensions: []
|
67
94
|
|
68
|
-
extra_rdoc_files:
|
69
|
-
|
95
|
+
extra_rdoc_files: []
|
96
|
+
|
70
97
|
files:
|
71
98
|
- .gitignore
|
72
99
|
- CHANGELOG.rdoc
|
73
|
-
-
|
100
|
+
- Gemfile
|
101
|
+
- README.md
|
74
102
|
- Rakefile
|
75
|
-
- VERSION
|
76
103
|
- em-websocket.gemspec
|
77
104
|
- examples/echo.rb
|
78
105
|
- examples/js/FABridge.js
|
@@ -84,13 +111,21 @@ files:
|
|
84
111
|
- lib/em-websocket.rb
|
85
112
|
- lib/em-websocket/connection.rb
|
86
113
|
- lib/em-websocket/debugger.rb
|
114
|
+
- lib/em-websocket/framing03.rb
|
115
|
+
- lib/em-websocket/framing76.rb
|
87
116
|
- lib/em-websocket/handler.rb
|
117
|
+
- lib/em-websocket/handler03.rb
|
88
118
|
- lib/em-websocket/handler75.rb
|
89
119
|
- lib/em-websocket/handler76.rb
|
90
120
|
- lib/em-websocket/handler_factory.rb
|
121
|
+
- lib/em-websocket/handshake75.rb
|
122
|
+
- lib/em-websocket/handshake76.rb
|
123
|
+
- lib/em-websocket/version.rb
|
91
124
|
- lib/em-websocket/websocket.rb
|
92
125
|
- spec/helper.rb
|
93
|
-
- spec/integration/
|
126
|
+
- spec/integration/draft03_spec.rb
|
127
|
+
- spec/integration/draft76_spec.rb
|
128
|
+
- spec/unit/framing_spec.rb
|
94
129
|
- spec/unit/handler_spec.rb
|
95
130
|
- spec/websocket_spec.rb
|
96
131
|
has_rdoc: true
|
@@ -98,8 +133,8 @@ homepage: http://github.com/igrigorik/em-websocket
|
|
98
133
|
licenses: []
|
99
134
|
|
100
135
|
post_install_message:
|
101
|
-
rdoc_options:
|
102
|
-
|
136
|
+
rdoc_options: []
|
137
|
+
|
103
138
|
require_paths:
|
104
139
|
- lib
|
105
140
|
required_ruby_version: !ruby/object:Gem::Requirement
|
@@ -125,9 +160,8 @@ specification_version: 3
|
|
125
160
|
summary: EventMachine based WebSocket server
|
126
161
|
test_files:
|
127
162
|
- spec/helper.rb
|
128
|
-
- spec/integration/
|
163
|
+
- spec/integration/draft03_spec.rb
|
164
|
+
- spec/integration/draft76_spec.rb
|
165
|
+
- spec/unit/framing_spec.rb
|
129
166
|
- spec/unit/handler_spec.rb
|
130
167
|
- spec/websocket_spec.rb
|
131
|
-
- examples/echo.rb
|
132
|
-
- examples/multicast.rb
|
133
|
-
- examples/srv.rb
|