em-websocket 0.3.7 → 0.5.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/CHANGELOG.rdoc +52 -0
- data/Gemfile +6 -0
- data/LICENCE +7 -0
- data/README.md +105 -40
- data/examples/echo.rb +22 -6
- data/examples/test.html +5 -6
- data/lib/em-websocket.rb +2 -1
- data/lib/em-websocket/close03.rb +3 -0
- data/lib/em-websocket/close05.rb +3 -0
- data/lib/em-websocket/close06.rb +3 -0
- data/lib/em-websocket/close75.rb +2 -1
- data/lib/em-websocket/connection.rb +154 -48
- data/lib/em-websocket/framing03.rb +3 -2
- data/lib/em-websocket/framing05.rb +3 -2
- data/lib/em-websocket/framing07.rb +16 -4
- data/lib/em-websocket/framing76.rb +1 -4
- data/lib/em-websocket/handler.rb +61 -15
- data/lib/em-websocket/handler03.rb +0 -1
- data/lib/em-websocket/handler05.rb +0 -1
- data/lib/em-websocket/handler06.rb +0 -1
- data/lib/em-websocket/handler07.rb +0 -1
- data/lib/em-websocket/handler08.rb +0 -1
- data/lib/em-websocket/handler13.rb +0 -1
- data/lib/em-websocket/handler76.rb +2 -0
- data/lib/em-websocket/handshake.rb +156 -0
- data/lib/em-websocket/handshake04.rb +18 -16
- data/lib/em-websocket/handshake75.rb +15 -8
- data/lib/em-websocket/handshake76.rb +15 -14
- data/lib/em-websocket/masking04.rb +3 -6
- data/lib/em-websocket/message_processor_03.rb +6 -3
- data/lib/em-websocket/message_processor_06.rb +30 -9
- data/lib/em-websocket/version.rb +1 -1
- data/lib/em-websocket/websocket.rb +24 -15
- data/spec/helper.rb +84 -51
- data/spec/integration/common_spec.rb +89 -69
- data/spec/integration/draft03_spec.rb +84 -56
- data/spec/integration/draft05_spec.rb +14 -12
- data/spec/integration/draft06_spec.rb +67 -7
- data/spec/integration/draft13_spec.rb +30 -19
- data/spec/integration/draft75_spec.rb +46 -40
- data/spec/integration/draft76_spec.rb +59 -45
- data/spec/integration/gte_03_examples.rb +42 -0
- data/spec/integration/shared_examples.rb +119 -0
- data/spec/unit/framing_spec.rb +24 -4
- data/spec/unit/handshake_spec.rb +216 -0
- data/spec/unit/masking_spec.rb +2 -0
- metadata +32 -86
- data/examples/flash_policy_file_server.rb +0 -21
- data/examples/js/FABridge.js +0 -604
- data/examples/js/WebSocketMain.swf +0 -0
- data/examples/js/swfobject.js +0 -4
- data/examples/js/web_socket.js +0 -312
- data/lib/em-websocket/handler_factory.rb +0 -109
- data/spec/unit/handler_spec.rb +0 -159
@@ -20,28 +20,30 @@ describe "draft05" do
|
|
20
20
|
}
|
21
21
|
}
|
22
22
|
end
|
23
|
-
|
24
|
-
def start_server
|
25
|
-
EM::WebSocket.start(:host => "0.0.0.0", :port => 12345) { |ws|
|
26
|
-
yield ws
|
27
|
-
}
|
28
|
-
end
|
29
23
|
|
30
24
|
def start_client
|
31
|
-
client = EM.connect('0.0.0.0', 12345,
|
25
|
+
client = EM.connect('0.0.0.0', 12345, Draft05FakeWebSocketClient)
|
32
26
|
client.send_data(format_request(@request))
|
33
27
|
yield client if block_given?
|
28
|
+
return client
|
34
29
|
end
|
35
30
|
|
36
|
-
|
31
|
+
it_behaves_like "a websocket server" do
|
32
|
+
let(:version) { 5 }
|
33
|
+
end
|
34
|
+
|
35
|
+
it_behaves_like "a WebSocket server drafts 3 and above" do
|
36
|
+
let(:version) { 5 }
|
37
|
+
end
|
38
|
+
|
39
|
+
it "should report that close codes are not supported" do
|
37
40
|
em {
|
38
|
-
start_server { |
|
39
|
-
|
40
|
-
|
41
|
+
start_server { |ws|
|
42
|
+
ws.onopen {
|
43
|
+
ws.supports_close_codes?.should == false
|
41
44
|
done
|
42
45
|
}
|
43
46
|
}
|
44
|
-
|
45
47
|
start_client
|
46
48
|
}
|
47
49
|
end
|
@@ -26,22 +26,26 @@ describe "draft06" do
|
|
26
26
|
"Upgrade" => "websocket",
|
27
27
|
"Connection" => "Upgrade",
|
28
28
|
"Sec-WebSocket-Accept" => "s3pPLMBiTxaQ9kYGzzhZRbK+xOo=",
|
29
|
+
"Sec-WebSocket-Protocol" => "sample",
|
29
30
|
}
|
30
31
|
}
|
31
32
|
end
|
32
|
-
|
33
|
-
def start_server
|
34
|
-
EM::WebSocket.start(:host => "0.0.0.0", :port => 12345) { |ws|
|
35
|
-
yield ws
|
36
|
-
}
|
37
|
-
end
|
38
33
|
|
39
34
|
def start_client
|
40
|
-
client = EM.connect('0.0.0.0', 12345,
|
35
|
+
client = EM.connect('0.0.0.0', 12345, Draft05FakeWebSocketClient)
|
41
36
|
client.send_data(format_request(@request))
|
42
37
|
yield client if block_given?
|
38
|
+
return client
|
43
39
|
end
|
44
40
|
|
41
|
+
it_behaves_like "a websocket server" do
|
42
|
+
let(:version) { 6 }
|
43
|
+
end
|
44
|
+
|
45
|
+
it_behaves_like "a WebSocket server drafts 3 and above" do
|
46
|
+
let(:version) { 6 }
|
47
|
+
end
|
48
|
+
|
45
49
|
it "should open connection" do
|
46
50
|
em {
|
47
51
|
start_server { |server|
|
@@ -82,4 +86,60 @@ describe "draft06" do
|
|
82
86
|
}
|
83
87
|
}
|
84
88
|
end
|
89
|
+
|
90
|
+
it "should return close code and reason if closed via handshake" do
|
91
|
+
em {
|
92
|
+
start_server { |ws|
|
93
|
+
ws.onclose { |event|
|
94
|
+
# 2. Receive close event in server
|
95
|
+
event.should == {
|
96
|
+
:code => 4004,
|
97
|
+
:reason => "close reason",
|
98
|
+
:was_clean => true,
|
99
|
+
}
|
100
|
+
done
|
101
|
+
}
|
102
|
+
}
|
103
|
+
start_client { |client|
|
104
|
+
client.onopen {
|
105
|
+
# 1: Send close handshake
|
106
|
+
close_data = [4004].pack('n')
|
107
|
+
close_data << "close reason"
|
108
|
+
client.send_frame(:close, close_data)
|
109
|
+
}
|
110
|
+
}
|
111
|
+
}
|
112
|
+
end
|
113
|
+
|
114
|
+
it "should return close code 1005 if no code was specified" do
|
115
|
+
em {
|
116
|
+
start_server { |ws|
|
117
|
+
ws.onclose { |event|
|
118
|
+
event.should == {
|
119
|
+
:code => 1005,
|
120
|
+
:reason => "",
|
121
|
+
:was_clean => true,
|
122
|
+
}
|
123
|
+
done
|
124
|
+
}
|
125
|
+
}
|
126
|
+
start_client { |client|
|
127
|
+
client.onopen {
|
128
|
+
client.send_frame(:close, '')
|
129
|
+
}
|
130
|
+
}
|
131
|
+
}
|
132
|
+
end
|
133
|
+
|
134
|
+
it "should report that close codes are supported" do
|
135
|
+
em {
|
136
|
+
start_server { |ws|
|
137
|
+
ws.onopen {
|
138
|
+
ws.supports_close_codes?.should == true
|
139
|
+
done
|
140
|
+
}
|
141
|
+
}
|
142
|
+
start_client
|
143
|
+
}
|
144
|
+
end
|
85
145
|
end
|
@@ -1,5 +1,6 @@
|
|
1
|
+
# encoding: BINARY
|
2
|
+
|
1
3
|
require 'helper'
|
2
|
-
require 'integration/shared_examples'
|
3
4
|
|
4
5
|
describe "draft13" do
|
5
6
|
include EM::SpecHelper
|
@@ -27,31 +28,31 @@ describe "draft13" do
|
|
27
28
|
"Upgrade" => "websocket",
|
28
29
|
"Connection" => "Upgrade",
|
29
30
|
"Sec-WebSocket-Accept" => "s3pPLMBiTxaQ9kYGzzhZRbK+xOo=",
|
31
|
+
"Sec-WebSocket-Protocol" => "sample",
|
30
32
|
}
|
31
33
|
}
|
32
34
|
end
|
33
35
|
|
36
|
+
def start_client
|
37
|
+
client = EM.connect('0.0.0.0', 12345, Draft07FakeWebSocketClient)
|
38
|
+
client.send_data(format_request(@request))
|
39
|
+
yield client if block_given?
|
40
|
+
return client
|
41
|
+
end
|
42
|
+
|
34
43
|
it_behaves_like "a websocket server" do
|
35
|
-
|
36
|
-
|
37
|
-
yield ws
|
38
|
-
}
|
39
|
-
end
|
44
|
+
let(:version) { 13 }
|
45
|
+
end
|
40
46
|
|
41
|
-
|
42
|
-
|
43
|
-
client.send_data(format_request(@request))
|
44
|
-
yield client if block_given?
|
45
|
-
end
|
47
|
+
it_behaves_like "a WebSocket server drafts 3 and above" do
|
48
|
+
let(:version) { 13 }
|
46
49
|
end
|
47
50
|
|
48
51
|
it "should send back the correct handshake response" do
|
49
52
|
em {
|
50
|
-
|
53
|
+
start_server
|
51
54
|
|
52
|
-
|
53
|
-
connection = EM.connect('0.0.0.0', 12345, Draft07FakeWebSocketClient)
|
54
|
-
connection.send_data(format_request(@request))
|
55
|
+
connection = start_client
|
55
56
|
|
56
57
|
connection.onopen {
|
57
58
|
connection.handshake_response.lines.sort.
|
@@ -64,7 +65,7 @@ describe "draft13" do
|
|
64
65
|
# TODO: This test would be much nicer with a real websocket client...
|
65
66
|
it "should support sending pings and binding to onpong" do
|
66
67
|
em {
|
67
|
-
|
68
|
+
start_server { |ws|
|
68
69
|
ws.onopen {
|
69
70
|
ws.should be_pingable
|
70
71
|
EM.next_tick {
|
@@ -78,9 +79,7 @@ describe "draft13" do
|
|
78
79
|
}
|
79
80
|
}
|
80
81
|
|
81
|
-
|
82
|
-
connection = EM.connect('0.0.0.0', 12345, Draft07FakeWebSocketClient)
|
83
|
-
connection.send_data(format_request(@request))
|
82
|
+
connection = start_client
|
84
83
|
|
85
84
|
# Confusing, fake onmessage means any data after the handshake
|
86
85
|
connection.onmessage { |data|
|
@@ -91,4 +90,16 @@ describe "draft13" do
|
|
91
90
|
}
|
92
91
|
}
|
93
92
|
end
|
93
|
+
|
94
|
+
it "should report that close codes are supported" do
|
95
|
+
em {
|
96
|
+
start_server { |ws|
|
97
|
+
ws.onopen {
|
98
|
+
ws.supports_close_codes?.should == true
|
99
|
+
done
|
100
|
+
}
|
101
|
+
}
|
102
|
+
start_client
|
103
|
+
}
|
104
|
+
end
|
94
105
|
end
|
@@ -1,5 +1,4 @@
|
|
1
1
|
require 'helper'
|
2
|
-
require 'integration/shared_examples'
|
3
2
|
|
4
3
|
# These integration tests are older and use a different testing style to the
|
5
4
|
# integration tests for newer drafts. They use EM::HttpRequest which happens
|
@@ -9,38 +8,35 @@ describe "WebSocket server draft75" do
|
|
9
8
|
include EM::SpecHelper
|
10
9
|
default_timeout 1
|
11
10
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
end
|
11
|
+
def start_client
|
12
|
+
client = Draft75WebSocketClient.new
|
13
|
+
yield client if block_given?
|
14
|
+
return client
|
15
|
+
end
|
18
16
|
|
19
|
-
|
20
|
-
|
21
|
-
yield client if block_given?
|
22
|
-
end
|
17
|
+
it_behaves_like "a websocket server" do
|
18
|
+
let(:version) { 75 }
|
23
19
|
end
|
24
20
|
|
25
21
|
it "should automatically complete WebSocket handshake" do
|
26
22
|
em {
|
27
23
|
MSG = "Hello World!"
|
28
24
|
EventMachine.add_timer(0.1) do
|
29
|
-
|
30
|
-
|
31
|
-
|
25
|
+
ws = EventMachine::WebSocketClient.connect('ws://127.0.0.1:12345/')
|
26
|
+
ws.errback { fail }
|
27
|
+
ws.callback { }
|
32
28
|
|
33
|
-
|
34
|
-
msg.should == MSG
|
29
|
+
ws.stream { |msg|
|
30
|
+
msg.data.should == MSG
|
35
31
|
EventMachine.stop
|
36
32
|
}
|
37
33
|
end
|
38
34
|
|
39
|
-
|
35
|
+
start_server { |ws|
|
40
36
|
ws.onopen {
|
41
37
|
ws.send MSG
|
42
38
|
}
|
43
|
-
|
39
|
+
}
|
44
40
|
}
|
45
41
|
end
|
46
42
|
|
@@ -50,17 +46,16 @@ describe "WebSocket server draft75" do
|
|
50
46
|
received = []
|
51
47
|
|
52
48
|
EventMachine.add_timer(0.1) do
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
http.send messages[1]
|
49
|
+
ws = EventMachine::WebSocketClient.connect('ws://127.0.0.1:12345/')
|
50
|
+
ws.errback { fail }
|
51
|
+
ws.stream {|msg|}
|
52
|
+
ws.callback {
|
53
|
+
ws.send_msg messages[0]
|
54
|
+
ws.send_msg messages[1]
|
60
55
|
}
|
61
56
|
end
|
62
57
|
|
63
|
-
|
58
|
+
start_server { |ws|
|
64
59
|
ws.onopen {}
|
65
60
|
ws.onclose {}
|
66
61
|
ws.onmessage {|msg|
|
@@ -69,49 +64,60 @@ describe "WebSocket server draft75" do
|
|
69
64
|
|
70
65
|
EventMachine.stop if received.size == messages.size
|
71
66
|
}
|
72
|
-
|
67
|
+
}
|
73
68
|
}
|
74
69
|
end
|
75
70
|
|
76
71
|
it "should call onclose callback when client closes connection" do
|
77
72
|
em {
|
78
73
|
EventMachine.add_timer(0.1) do
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
http.close_connection
|
74
|
+
ws = EventMachine::WebSocketClient.connect('ws://127.0.0.1:12345/')
|
75
|
+
ws.errback { fail }
|
76
|
+
ws.callback {
|
77
|
+
ws.close_connection
|
84
78
|
}
|
85
|
-
|
79
|
+
ws.stream{|msg|}
|
86
80
|
end
|
87
81
|
|
88
|
-
|
82
|
+
start_server { |ws|
|
89
83
|
ws.onopen {}
|
90
84
|
ws.onclose {
|
91
85
|
ws.state.should == :closed
|
92
86
|
EventMachine.stop
|
93
87
|
}
|
94
|
-
|
88
|
+
}
|
95
89
|
}
|
96
90
|
end
|
97
91
|
|
98
92
|
it "should call onerror callback with raised exception and close connection on bad handshake" do
|
99
93
|
em {
|
100
94
|
EventMachine.add_timer(0.1) do
|
101
|
-
http =
|
102
|
-
http.errback {
|
95
|
+
http = EM::HttpRequest.new('http://127.0.0.1:12345/').get
|
96
|
+
http.errback { }
|
103
97
|
http.callback { fail }
|
104
98
|
end
|
105
99
|
|
106
|
-
|
100
|
+
start_server { |ws|
|
107
101
|
ws.onopen { fail }
|
108
102
|
ws.onclose { EventMachine.stop }
|
109
103
|
ws.onerror {|e|
|
110
104
|
e.should be_an_instance_of EventMachine::WebSocket::HandshakeError
|
111
|
-
e.message.should match('
|
105
|
+
e.message.should match('Not an upgrade request')
|
112
106
|
EventMachine.stop
|
113
107
|
}
|
114
|
-
|
108
|
+
}
|
109
|
+
}
|
110
|
+
end
|
111
|
+
|
112
|
+
it "should report that close codes are not supported" do
|
113
|
+
em {
|
114
|
+
start_server { |ws|
|
115
|
+
ws.onopen {
|
116
|
+
ws.supports_close_codes?.should == false
|
117
|
+
done
|
118
|
+
}
|
119
|
+
}
|
120
|
+
start_client
|
115
121
|
}
|
116
122
|
end
|
117
123
|
end
|
@@ -1,5 +1,6 @@
|
|
1
|
+
# encoding: BINARY
|
2
|
+
|
1
3
|
require 'helper'
|
2
|
-
require 'integration/shared_examples'
|
3
4
|
|
4
5
|
describe "WebSocket server draft76" do
|
5
6
|
include EM::SpecHelper
|
@@ -33,44 +34,37 @@ describe "WebSocket server draft76" do
|
|
33
34
|
:body => "8jKS\'y:G*Co,Wxa-"
|
34
35
|
}
|
35
36
|
end
|
36
|
-
|
37
|
-
it_behaves_like "a websocket server" do
|
38
|
-
def start_server
|
39
|
-
EM::WebSocket.start(:host => "0.0.0.0", :port => 12345) { |ws|
|
40
|
-
yield ws
|
41
|
-
}
|
42
|
-
end
|
43
37
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
38
|
+
def start_client
|
39
|
+
client = EM.connect('0.0.0.0', 12345, FakeWebSocketClient)
|
40
|
+
client.send_data(format_request(@request))
|
41
|
+
yield client if block_given?
|
42
|
+
return client
|
43
|
+
end
|
44
|
+
|
45
|
+
it_behaves_like "a websocket server" do
|
46
|
+
let(:version) { 76 }
|
49
47
|
end
|
50
48
|
|
51
49
|
it "should send back the correct handshake response" do
|
52
50
|
em {
|
53
|
-
|
54
|
-
|
55
|
-
# Create a fake client which sends draft 76 handshake
|
56
|
-
connection = EM.connect('0.0.0.0', 12345, FakeWebSocketClient)
|
57
|
-
connection.send_data(format_request(@request))
|
51
|
+
start_server
|
58
52
|
|
59
|
-
|
60
|
-
connection.
|
61
|
-
|
62
|
-
|
53
|
+
start_client { |connection|
|
54
|
+
connection.onopen {
|
55
|
+
connection.handshake_response.lines.sort.
|
56
|
+
should == format_response(@response).lines.sort
|
57
|
+
done
|
58
|
+
}
|
63
59
|
}
|
64
60
|
}
|
65
61
|
end
|
66
62
|
|
67
63
|
it "should send closing frame back and close the connection after recieving closing frame" do
|
68
64
|
em {
|
69
|
-
|
65
|
+
start_server
|
70
66
|
|
71
|
-
|
72
|
-
connection = EM.connect('0.0.0.0', 12345, FakeWebSocketClient)
|
73
|
-
connection.send_data(format_request(@request))
|
67
|
+
connection = start_client
|
74
68
|
|
75
69
|
# Send closing frame after handshake complete
|
76
70
|
connection.onopen {
|
@@ -89,16 +83,14 @@ describe "WebSocket server draft76" do
|
|
89
83
|
|
90
84
|
it "should ignore any data received after the closing frame" do
|
91
85
|
em {
|
92
|
-
|
86
|
+
start_server { |ws|
|
93
87
|
# Fail if foobar message is received
|
94
88
|
ws.onmessage { |msg|
|
95
89
|
fail
|
96
90
|
}
|
97
91
|
}
|
98
92
|
|
99
|
-
|
100
|
-
connection = EM.connect('0.0.0.0', 12345, FakeWebSocketClient)
|
101
|
-
connection.send_data(format_request(@request))
|
93
|
+
connection = start_client
|
102
94
|
|
103
95
|
# Send closing frame after handshake complete, followed by another msg
|
104
96
|
connection.onopen {
|
@@ -114,15 +106,13 @@ describe "WebSocket server draft76" do
|
|
114
106
|
|
115
107
|
it "should accept null bytes within the frame after a line return" do
|
116
108
|
em {
|
117
|
-
|
109
|
+
start_server { |ws|
|
118
110
|
ws.onmessage { |msg|
|
119
111
|
msg.should == "\n\000"
|
120
112
|
}
|
121
113
|
}
|
122
114
|
|
123
|
-
|
124
|
-
connection = EM.connect('0.0.0.0', 12345, FakeWebSocketClient)
|
125
|
-
connection.send_data(format_request(@request))
|
115
|
+
connection = start_client
|
126
116
|
|
127
117
|
# Send closing frame after handshake complete
|
128
118
|
connection.onopen {
|
@@ -138,7 +128,7 @@ describe "WebSocket server draft76" do
|
|
138
128
|
|
139
129
|
it "should handle unreasonable frame lengths by calling onerror callback" do
|
140
130
|
em {
|
141
|
-
|
131
|
+
start_server { |server|
|
142
132
|
server.onerror { |error|
|
143
133
|
error.should be_an_instance_of EM::WebSocket::WSMessageTooBigError
|
144
134
|
error.message.should == "Frame length too long (1180591620717411303296 bytes)"
|
@@ -146,9 +136,7 @@ describe "WebSocket server draft76" do
|
|
146
136
|
}
|
147
137
|
}
|
148
138
|
|
149
|
-
|
150
|
-
client = EM.connect('0.0.0.0', 12345, FakeWebSocketClient)
|
151
|
-
client.send_data(format_request(@request))
|
139
|
+
client = start_client
|
152
140
|
|
153
141
|
# This particular frame indicates a message length of
|
154
142
|
# 1180591620717411303296 bytes. Such a message would previously cause
|
@@ -162,7 +150,7 @@ describe "WebSocket server draft76" do
|
|
162
150
|
|
163
151
|
it "should handle impossible frames by calling onerror callback" do
|
164
152
|
em {
|
165
|
-
|
153
|
+
start_server { |server|
|
166
154
|
server.onerror { |error|
|
167
155
|
error.should be_an_instance_of EM::WebSocket::WSProtocolError
|
168
156
|
error.message.should == "Invalid frame received"
|
@@ -170,9 +158,7 @@ describe "WebSocket server draft76" do
|
|
170
158
|
}
|
171
159
|
}
|
172
160
|
|
173
|
-
|
174
|
-
client = EM.connect('0.0.0.0', 12345, FakeWebSocketClient)
|
175
|
-
client.send_data(format_request(@request))
|
161
|
+
client = start_client
|
176
162
|
|
177
163
|
client.onopen {
|
178
164
|
client.send_data("foobar") # Does not start with \x00 or \xff
|
@@ -182,10 +168,10 @@ describe "WebSocket server draft76" do
|
|
182
168
|
|
183
169
|
it "should handle invalid http requests by raising HandshakeError passed to onerror callback" do
|
184
170
|
em {
|
185
|
-
|
171
|
+
start_server { |server|
|
186
172
|
server.onerror { |error|
|
187
173
|
error.should be_an_instance_of EM::WebSocket::HandshakeError
|
188
|
-
error.message.should == "Invalid HTTP header"
|
174
|
+
error.message.should == "Invalid HTTP header: Could not parse data entirely (1 != 29)"
|
189
175
|
done
|
190
176
|
}
|
191
177
|
}
|
@@ -197,7 +183,7 @@ describe "WebSocket server draft76" do
|
|
197
183
|
|
198
184
|
it "should handle handshake request split into two TCP packets" do
|
199
185
|
em {
|
200
|
-
|
186
|
+
start_server
|
201
187
|
|
202
188
|
# Create a fake client which sends draft 76 handshake
|
203
189
|
connection = EM.connect('0.0.0.0', 12345, FakeWebSocketClient)
|
@@ -217,4 +203,32 @@ describe "WebSocket server draft76" do
|
|
217
203
|
end
|
218
204
|
}
|
219
205
|
end
|
206
|
+
|
207
|
+
it "should report that close codes are not supported" do
|
208
|
+
em {
|
209
|
+
start_server { |ws|
|
210
|
+
ws.onopen {
|
211
|
+
ws.supports_close_codes?.should == false
|
212
|
+
done
|
213
|
+
}
|
214
|
+
}
|
215
|
+
start_client
|
216
|
+
}
|
217
|
+
end
|
218
|
+
|
219
|
+
it "should call onclose when the server closes the connection [antiregression]" do
|
220
|
+
em {
|
221
|
+
start_server { |ws|
|
222
|
+
ws.onopen {
|
223
|
+
EM.add_timer(0.1) {
|
224
|
+
ws.close()
|
225
|
+
}
|
226
|
+
}
|
227
|
+
ws.onclose {
|
228
|
+
done
|
229
|
+
}
|
230
|
+
}
|
231
|
+
start_client
|
232
|
+
}
|
233
|
+
end
|
220
234
|
end
|