em-websocket 0.4.0 → 0.5.3

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 (41) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.rdoc +35 -1
  3. data/Gemfile +6 -0
  4. data/LICENCE +7 -0
  5. data/README.md +49 -7
  6. data/em-websocket.gemspec +2 -8
  7. data/examples/test.html +3 -1
  8. data/lib/em-websocket/close03.rb +3 -0
  9. data/lib/em-websocket/close05.rb +3 -0
  10. data/lib/em-websocket/close06.rb +3 -0
  11. data/lib/em-websocket/close75.rb +2 -1
  12. data/lib/em-websocket/connection.rb +118 -26
  13. data/lib/em-websocket/framing03.rb +3 -2
  14. data/lib/em-websocket/framing05.rb +3 -2
  15. data/lib/em-websocket/framing07.rb +16 -4
  16. data/lib/em-websocket/framing76.rb +1 -4
  17. data/lib/em-websocket/handler.rb +31 -3
  18. data/lib/em-websocket/handler76.rb +2 -0
  19. data/lib/em-websocket/handshake.rb +23 -4
  20. data/lib/em-websocket/handshake04.rb +10 -6
  21. data/lib/em-websocket/handshake75.rb +11 -1
  22. data/lib/em-websocket/handshake76.rb +4 -0
  23. data/lib/em-websocket/masking04.rb +1 -5
  24. data/lib/em-websocket/message_processor_03.rb +6 -3
  25. data/lib/em-websocket/message_processor_06.rb +30 -9
  26. data/lib/em-websocket/version.rb +1 -1
  27. data/lib/em-websocket/websocket.rb +7 -0
  28. data/spec/helper.rb +67 -52
  29. data/spec/integration/common_spec.rb +49 -32
  30. data/spec/integration/draft03_spec.rb +83 -57
  31. data/spec/integration/draft05_spec.rb +14 -12
  32. data/spec/integration/draft06_spec.rb +67 -7
  33. data/spec/integration/draft13_spec.rb +29 -20
  34. data/spec/integration/draft75_spec.rb +44 -40
  35. data/spec/integration/draft76_spec.rb +58 -46
  36. data/spec/integration/gte_03_examples.rb +42 -0
  37. data/spec/integration/shared_examples.rb +93 -0
  38. data/spec/unit/framing_spec.rb +24 -4
  39. data/spec/unit/handshake_spec.rb +24 -1
  40. data/spec/unit/masking_spec.rb +2 -0
  41. metadata +18 -107
@@ -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,46 +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
- let(:version) { 76 }
39
37
 
40
- def start_server
41
- EM::WebSocket.start(:host => "0.0.0.0", :port => 12345) { |ws|
42
- yield ws
43
- }
44
- end
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
45
44
 
46
- def start_client
47
- client = EM.connect('0.0.0.0', 12345, FakeWebSocketClient)
48
- client.send_data(format_request(@request))
49
- yield client if block_given?
50
- end
45
+ it_behaves_like "a websocket server" do
46
+ let(:version) { 76 }
51
47
  end
52
48
 
53
49
  it "should send back the correct handshake response" do
54
50
  em {
55
- EventMachine::WebSocket.start(:host => "0.0.0.0", :port => 12345) { }
56
-
57
- # Create a fake client which sends draft 76 handshake
58
- connection = EM.connect('0.0.0.0', 12345, FakeWebSocketClient)
59
- connection.send_data(format_request(@request))
51
+ start_server
60
52
 
61
- connection.onopen {
62
- connection.handshake_response.lines.sort.
63
- should == format_response(@response).lines.sort
64
- done
53
+ start_client { |connection|
54
+ connection.onopen {
55
+ connection.handshake_response.lines.sort.
56
+ should == format_response(@response).lines.sort
57
+ done
58
+ }
65
59
  }
66
60
  }
67
61
  end
68
62
 
69
63
  it "should send closing frame back and close the connection after recieving closing frame" do
70
64
  em {
71
- EventMachine::WebSocket.start(:host => "0.0.0.0", :port => 12345) { }
65
+ start_server
72
66
 
73
- # Create a fake client which sends draft 76 handshake
74
- connection = EM.connect('0.0.0.0', 12345, FakeWebSocketClient)
75
- connection.send_data(format_request(@request))
67
+ connection = start_client
76
68
 
77
69
  # Send closing frame after handshake complete
78
70
  connection.onopen {
@@ -91,16 +83,14 @@ describe "WebSocket server draft76" do
91
83
 
92
84
  it "should ignore any data received after the closing frame" do
93
85
  em {
94
- EventMachine::WebSocket.start(:host => "0.0.0.0", :port => 12345) { |ws|
86
+ start_server { |ws|
95
87
  # Fail if foobar message is received
96
88
  ws.onmessage { |msg|
97
89
  fail
98
90
  }
99
91
  }
100
92
 
101
- # Create a fake client which sends draft 76 handshake
102
- connection = EM.connect('0.0.0.0', 12345, FakeWebSocketClient)
103
- connection.send_data(format_request(@request))
93
+ connection = start_client
104
94
 
105
95
  # Send closing frame after handshake complete, followed by another msg
106
96
  connection.onopen {
@@ -116,15 +106,13 @@ describe "WebSocket server draft76" do
116
106
 
117
107
  it "should accept null bytes within the frame after a line return" do
118
108
  em {
119
- EventMachine::WebSocket.start(:host => "0.0.0.0", :port => 12345) { |ws|
109
+ start_server { |ws|
120
110
  ws.onmessage { |msg|
121
111
  msg.should == "\n\000"
122
112
  }
123
113
  }
124
114
 
125
- # Create a fake client which sends draft 76 handshake
126
- connection = EM.connect('0.0.0.0', 12345, FakeWebSocketClient)
127
- connection.send_data(format_request(@request))
115
+ connection = start_client
128
116
 
129
117
  # Send closing frame after handshake complete
130
118
  connection.onopen {
@@ -140,7 +128,7 @@ describe "WebSocket server draft76" do
140
128
 
141
129
  it "should handle unreasonable frame lengths by calling onerror callback" do
142
130
  em {
143
- EventMachine::WebSocket.start(:host => "0.0.0.0", :port => 12345) { |server|
131
+ start_server { |server|
144
132
  server.onerror { |error|
145
133
  error.should be_an_instance_of EM::WebSocket::WSMessageTooBigError
146
134
  error.message.should == "Frame length too long (1180591620717411303296 bytes)"
@@ -148,9 +136,7 @@ describe "WebSocket server draft76" do
148
136
  }
149
137
  }
150
138
 
151
- # Create a fake client which sends draft 76 handshake
152
- client = EM.connect('0.0.0.0', 12345, FakeWebSocketClient)
153
- client.send_data(format_request(@request))
139
+ client = start_client
154
140
 
155
141
  # This particular frame indicates a message length of
156
142
  # 1180591620717411303296 bytes. Such a message would previously cause
@@ -164,7 +150,7 @@ describe "WebSocket server draft76" do
164
150
 
165
151
  it "should handle impossible frames by calling onerror callback" do
166
152
  em {
167
- EventMachine::WebSocket.start(:host => "0.0.0.0", :port => 12345) { |server|
153
+ start_server { |server|
168
154
  server.onerror { |error|
169
155
  error.should be_an_instance_of EM::WebSocket::WSProtocolError
170
156
  error.message.should == "Invalid frame received"
@@ -172,9 +158,7 @@ describe "WebSocket server draft76" do
172
158
  }
173
159
  }
174
160
 
175
- # Create a fake client which sends draft 76 handshake
176
- client = EM.connect('0.0.0.0', 12345, FakeWebSocketClient)
177
- client.send_data(format_request(@request))
161
+ client = start_client
178
162
 
179
163
  client.onopen {
180
164
  client.send_data("foobar") # Does not start with \x00 or \xff
@@ -184,10 +168,10 @@ describe "WebSocket server draft76" do
184
168
 
185
169
  it "should handle invalid http requests by raising HandshakeError passed to onerror callback" do
186
170
  em {
187
- EventMachine::WebSocket.start(:host => "0.0.0.0", :port => 12345) { |server|
171
+ start_server { |server|
188
172
  server.onerror { |error|
189
173
  error.should be_an_instance_of EM::WebSocket::HandshakeError
190
- error.message.should == "Invalid HTTP header: Could not parse data entirely"
174
+ error.message.should == "Invalid HTTP header: Could not parse data entirely (1 != 29)"
191
175
  done
192
176
  }
193
177
  }
@@ -199,7 +183,7 @@ describe "WebSocket server draft76" do
199
183
 
200
184
  it "should handle handshake request split into two TCP packets" do
201
185
  em {
202
- EventMachine::WebSocket.start(:host => "0.0.0.0", :port => 12345) { }
186
+ start_server
203
187
 
204
188
  # Create a fake client which sends draft 76 handshake
205
189
  connection = EM.connect('0.0.0.0', 12345, FakeWebSocketClient)
@@ -219,4 +203,32 @@ describe "WebSocket server draft76" do
219
203
  end
220
204
  }
221
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
222
234
  end
@@ -0,0 +1,42 @@
1
+ shared_examples_for "a WebSocket server drafts 3 and above" do
2
+ it "should force close connections after a timeout if close handshake is not sent by the client" do
3
+ em {
4
+ server_onerror_fired = false
5
+ server_onclose_fired = false
6
+ client_got_close_handshake = false
7
+
8
+ start_server(:close_timeout => 0.1) { |ws|
9
+ ws.onopen {
10
+ # 1: Send close handshake to client
11
+ EM.next_tick { ws.close(4999, "Close message") }
12
+ }
13
+
14
+ ws.onerror { |e|
15
+ # 3: Client should receive onerror
16
+ e.class.should == EM::WebSocket::WSProtocolError
17
+ e.message.should == "Close handshake un-acked after 0.1s, closing tcp connection"
18
+ server_onerror_fired = true
19
+ }
20
+
21
+ ws.onclose {
22
+ server_onclose_fired = true
23
+ }
24
+ }
25
+ start_client { |client|
26
+ client.onmessage { |msg|
27
+ # 2: Client does not respond to close handshake (the fake client
28
+ # doesn't understand them at all hence this is in onmessage)
29
+ msg.should =~ /Close message/ if version >= 6
30
+ client_got_close_handshake = true
31
+ }
32
+
33
+ client.onclose {
34
+ server_onerror_fired.should == true
35
+ server_onclose_fired.should == true
36
+ client_got_close_handshake.should == true
37
+ done
38
+ }
39
+ }
40
+ }
41
+ end
42
+ end
@@ -29,6 +29,99 @@ shared_examples_for "a websocket server" do
29
29
  }
30
30
  end
31
31
 
32
+ it "should expose the remote IP address" do
33
+ em {
34
+ start_server { |ws|
35
+ ws.onopen {
36
+ ws.remote_ip.should == "127.0.0.1"
37
+ done
38
+ }
39
+ }
40
+
41
+ start_client
42
+ }
43
+ end
44
+
45
+ it "should send messages successfully" do
46
+ em {
47
+ start_server { |ws|
48
+ ws.onmessage { |message|
49
+ message.should == "hello server"
50
+ done
51
+ }
52
+ }
53
+
54
+ start_client { |client|
55
+ client.onopen {
56
+ client.send("hello server")
57
+ }
58
+ }
59
+ }
60
+ end
61
+
62
+ it "should allow connection to be closed with valid close code" do
63
+ em {
64
+ start_server { |ws|
65
+ ws.onopen {
66
+ ws.close(4004, "Bye bye")
67
+ done
68
+ }
69
+ }
70
+
71
+ start_client
72
+ # TODO: Use a real client which understands how to respond to closing
73
+ # handshakes, sending the handshake currently untested
74
+ }
75
+ end
76
+
77
+ it "should raise error if if invalid close code is used" do
78
+ em {
79
+ start_server { |ws|
80
+ ws.onopen {
81
+ lambda {
82
+ ws.close(2000)
83
+ }.should raise_error("Application code may only use codes from 1000, 3000-4999")
84
+ done
85
+ }
86
+ }
87
+
88
+ start_client
89
+ }
90
+ end
91
+
92
+ it "should call onclose with was_clean set to false if connection closed without closing handshake by server" do
93
+ em {
94
+ start_server { |ws|
95
+ ws.onopen {
96
+ # Close tcp connection (no close handshake)
97
+ ws.close_connection
98
+ }
99
+ ws.onclose { |event|
100
+ event.should == {:code => 1006, :was_clean => false}
101
+ done
102
+ }
103
+ }
104
+ start_client
105
+ }
106
+ end
107
+
108
+ it "should call onclose with was_clean set to false if connection closed without closing handshake by client" do
109
+ em {
110
+ start_server { |ws|
111
+ ws.onclose { |event|
112
+ event.should == {:code => 1006, :was_clean => false}
113
+ done
114
+ }
115
+ }
116
+ start_client { |client|
117
+ client.onopen {
118
+ # Close tcp connection (no close handshake)
119
+ client.close_connection
120
+ }
121
+ }
122
+ }
123
+ end
124
+
32
125
  it "should call onerror if an application error raised in onopen" do
33
126
  em {
34
127
  start_server { |ws|
@@ -1,3 +1,5 @@
1
+ # encoding: BINARY
2
+
1
3
  require 'helper'
2
4
 
3
5
  describe EM::WebSocket::Framing03 do
@@ -13,7 +15,7 @@ describe EM::WebSocket::Framing03 do
13
15
 
14
16
  def <<(data)
15
17
  @data << data
16
- process_data(data)
18
+ process_data
17
19
  end
18
20
 
19
21
  def debug(*args); end
@@ -138,7 +140,7 @@ describe EM::WebSocket::Framing04 do
138
140
 
139
141
  def <<(data)
140
142
  @data << data
141
- process_data(data)
143
+ process_data
142
144
  end
143
145
 
144
146
  def debug(*args); end
@@ -207,7 +209,7 @@ describe EM::WebSocket::Framing07 do
207
209
 
208
210
  def <<(data)
209
211
  @data << data
210
- process_data(data)
212
+ process_data
211
213
  end
212
214
 
213
215
  def debug(*args); end
@@ -265,7 +267,7 @@ describe EM::WebSocket::Framing07 do
265
267
  lambda {
266
268
  # Opcode 3 is not supported by this draft
267
269
  @f << "\x83\x05Hello"
268
- }.should raise_error(EventMachine::WebSocket::WSProtocolError, "Unknown opcode")
270
+ }.should raise_error(EventMachine::WebSocket::WSProtocolError, "Unknown opcode 3")
269
271
  end
270
272
 
271
273
  it "should accept a fragmented unmasked text message in 3 frames" do
@@ -274,5 +276,23 @@ describe EM::WebSocket::Framing07 do
274
276
  @f << "\x00\x02lo"
275
277
  @f << "\x80\x06 world"
276
278
  end
279
+
280
+ it "should raise if non-fin frame is followed by a non-continuation data frame (continuation frame would be expected)" do
281
+ lambda {
282
+ @f << 0b00000001 # Not fin, text
283
+ @f << 0b00000001 # Length 1
284
+ @f << 'f'
285
+ @f << 0b10000001 # fin, text (continutation expected)
286
+ @f << 0b00000001 # Length 1
287
+ @f << 'b'
288
+ }.should raise_error(EM::WebSocket::WebSocketError, 'Continuation frame expected')
289
+ end
290
+
291
+ it "should raise on non-fin control frames (control frames must not be fragmented)" do
292
+ lambda {
293
+ @f << 0b00001010 # Not fin, pong (opcode 10)
294
+ @f << 0b00000000 # Length 1
295
+ }.should raise_error(EM::WebSocket::WebSocketError, 'Control frames must not be fragmented')
296
+ end
277
297
  end
278
298
  end
@@ -126,6 +126,23 @@ describe EM::WebSocket::Handshake do
126
126
  end
127
127
  end
128
128
 
129
+ it "should raise error if Sec-WebSocket-Key1 is missing" do
130
+ @request[:headers].delete("Sec-WebSocket-Key1")
131
+
132
+ # The error message isn't correct since key1 is used to heuristically
133
+ # determine the protocol version in use, however this test at least checks
134
+ # that the handshake does correctly fail
135
+ handshake(@request).
136
+ should fail_with_error(EM::WebSocket::HandshakeError, 'Extra bytes after header')
137
+ end
138
+
139
+ it "should raise error if Sec-WebSocket-Key2 is missing" do
140
+ @request[:headers].delete("Sec-WebSocket-Key2")
141
+
142
+ handshake(@request).
143
+ should fail_with_error(EM::WebSocket::HandshakeError, 'WebSocket key1 or key2 is missing')
144
+ end
145
+
129
146
  it "should raise error if spaces do not divide numbers in Sec-WebSocket-Key* " do
130
147
  @request[:headers]['Sec-WebSocket-Key2'] = '12998 5 Y3 1.P00'
131
148
 
@@ -138,7 +155,7 @@ describe EM::WebSocket::Handshake do
138
155
  handshake.receive_data("\r\n\r\nfoobar")
139
156
 
140
157
  handshake.
141
- should fail_with_error(EM::WebSocket::HandshakeError, 'Invalid HTTP header: Could not parse data entirely')
158
+ should fail_with_error(EM::WebSocket::HandshakeError, 'Invalid HTTP header: Could not parse data entirely (4 != 10)')
142
159
  end
143
160
 
144
161
  # This might seems crazy, but very occasionally we saw multiple "Upgrade:
@@ -190,4 +207,10 @@ describe EM::WebSocket::Handshake do
190
207
 
191
208
  handshake(@request).should succeed_with_upgrade(@response)
192
209
  end
210
+
211
+ it "should fail if the request URI is invalid" do
212
+ @request[:path] = "/%"
213
+ handshake(@request).should \
214
+ fail_with_error(EM::WebSocket::HandshakeError, 'Invalid request URI: /%')
215
+ end
193
216
  end
@@ -23,5 +23,7 @@ describe EM::WebSocket::MaskedString do
23
23
  t.getbyte(4).should == 0x03
24
24
  t.read_mask
25
25
  t.getbyte(4).should == 0x01
26
+ t.unset_mask
27
+ t.getbyte(4).should == 0x03
26
28
  end
27
29
  end
metadata CHANGED
@@ -1,8 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: em-websocket
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
5
- prerelease:
4
+ version: 0.5.3
6
5
  platform: ruby
7
6
  authors:
8
7
  - Ilya Grigorik
@@ -10,118 +9,34 @@ authors:
10
9
  autorequire:
11
10
  bindir: bin
12
11
  cert_chain: []
13
- date: 2013-01-22 00:00:00.000000000 Z
12
+ date: 2021-11-11 00:00:00.000000000 Z
14
13
  dependencies:
15
14
  - !ruby/object:Gem::Dependency
16
15
  name: eventmachine
17
16
  requirement: !ruby/object:Gem::Requirement
18
- none: false
19
17
  requirements:
20
- - - ! '>='
18
+ - - ">="
21
19
  - !ruby/object:Gem::Version
22
20
  version: 0.12.9
23
21
  type: :runtime
24
22
  prerelease: false
25
23
  version_requirements: !ruby/object:Gem::Requirement
26
- none: false
27
24
  requirements:
28
- - - ! '>='
25
+ - - ">="
29
26
  - !ruby/object:Gem::Version
30
27
  version: 0.12.9
31
28
  - !ruby/object:Gem::Dependency
32
29
  name: http_parser.rb
33
30
  requirement: !ruby/object:Gem::Requirement
34
- none: false
35
31
  requirements:
36
- - - ~>
37
- - !ruby/object:Gem::Version
38
- version: 0.5.3
39
- type: :runtime
40
- prerelease: false
41
- version_requirements: !ruby/object:Gem::Requirement
42
- none: false
43
- requirements:
44
- - - ~>
45
- - !ruby/object:Gem::Version
46
- version: 0.5.3
47
- - !ruby/object:Gem::Dependency
48
- name: em-spec
49
- requirement: !ruby/object:Gem::Requirement
50
- none: false
51
- requirements:
52
- - - ~>
53
- - !ruby/object:Gem::Version
54
- version: 0.2.6
55
- type: :development
56
- prerelease: false
57
- version_requirements: !ruby/object:Gem::Requirement
58
- none: false
59
- requirements:
60
- - - ~>
61
- - !ruby/object:Gem::Version
62
- version: 0.2.6
63
- - !ruby/object:Gem::Dependency
64
- name: eventmachine
65
- requirement: !ruby/object:Gem::Requirement
66
- none: false
67
- requirements:
68
- - - ! '>='
69
- - !ruby/object:Gem::Version
70
- version: '0'
71
- type: :development
72
- prerelease: false
73
- version_requirements: !ruby/object:Gem::Requirement
74
- none: false
75
- requirements:
76
- - - ! '>='
32
+ - - "~>"
77
33
  - !ruby/object:Gem::Version
78
34
  version: '0'
79
- - !ruby/object:Gem::Dependency
80
- name: em-http-request
81
- requirement: !ruby/object:Gem::Requirement
82
- none: false
83
- requirements:
84
- - - ~>
85
- - !ruby/object:Gem::Version
86
- version: 0.2.6
87
- type: :development
88
- prerelease: false
89
- version_requirements: !ruby/object:Gem::Requirement
90
- none: false
91
- requirements:
92
- - - ~>
93
- - !ruby/object:Gem::Version
94
- version: 0.2.6
95
- - !ruby/object:Gem::Dependency
96
- name: rspec
97
- requirement: !ruby/object:Gem::Requirement
98
- none: false
99
- requirements:
100
- - - ~>
101
- - !ruby/object:Gem::Version
102
- version: 2.12.0
103
- type: :development
104
- prerelease: false
105
- version_requirements: !ruby/object:Gem::Requirement
106
- none: false
107
- requirements:
108
- - - ~>
109
- - !ruby/object:Gem::Version
110
- version: 2.12.0
111
- - !ruby/object:Gem::Dependency
112
- name: rake
113
- requirement: !ruby/object:Gem::Requirement
114
- none: false
115
- requirements:
116
- - - ! '>='
117
- - !ruby/object:Gem::Version
118
- version: '0'
119
- type: :development
35
+ type: :runtime
120
36
  prerelease: false
121
37
  version_requirements: !ruby/object:Gem::Requirement
122
- none: false
123
38
  requirements:
124
- - - ! '>='
39
+ - - "~>"
125
40
  - !ruby/object:Gem::Version
126
41
  version: '0'
127
42
  description: EventMachine based WebSocket server
@@ -132,9 +47,10 @@ executables: []
132
47
  extensions: []
133
48
  extra_rdoc_files: []
134
49
  files:
135
- - .gitignore
50
+ - ".gitignore"
136
51
  - CHANGELOG.rdoc
137
52
  - Gemfile
53
+ - LICENCE
138
54
  - README.md
139
55
  - Rakefile
140
56
  - em-websocket.gemspec
@@ -180,39 +96,33 @@ files:
180
96
  - spec/integration/draft13_spec.rb
181
97
  - spec/integration/draft75_spec.rb
182
98
  - spec/integration/draft76_spec.rb
99
+ - spec/integration/gte_03_examples.rb
183
100
  - spec/integration/shared_examples.rb
184
101
  - spec/unit/framing_spec.rb
185
102
  - spec/unit/handshake_spec.rb
186
103
  - spec/unit/masking_spec.rb
187
104
  homepage: http://github.com/igrigorik/em-websocket
188
- licenses: []
105
+ licenses:
106
+ - MIT
107
+ metadata: {}
189
108
  post_install_message:
190
109
  rdoc_options: []
191
110
  require_paths:
192
111
  - lib
193
112
  required_ruby_version: !ruby/object:Gem::Requirement
194
- none: false
195
113
  requirements:
196
- - - ! '>='
114
+ - - ">="
197
115
  - !ruby/object:Gem::Version
198
116
  version: '0'
199
- segments:
200
- - 0
201
- hash: 3969961455966824026
202
117
  required_rubygems_version: !ruby/object:Gem::Requirement
203
- none: false
204
118
  requirements:
205
- - - ! '>='
119
+ - - ">="
206
120
  - !ruby/object:Gem::Version
207
121
  version: '0'
208
- segments:
209
- - 0
210
- hash: 3969961455966824026
211
122
  requirements: []
212
- rubyforge_project: em-websocket
213
- rubygems_version: 1.8.24
123
+ rubygems_version: 3.0.3.1
214
124
  signing_key:
215
- specification_version: 3
125
+ specification_version: 4
216
126
  summary: EventMachine based WebSocket server
217
127
  test_files:
218
128
  - spec/helper.rb
@@ -223,6 +133,7 @@ test_files:
223
133
  - spec/integration/draft13_spec.rb
224
134
  - spec/integration/draft75_spec.rb
225
135
  - spec/integration/draft76_spec.rb
136
+ - spec/integration/gte_03_examples.rb
226
137
  - spec/integration/shared_examples.rb
227
138
  - spec/unit/framing_spec.rb
228
139
  - spec/unit/handshake_spec.rb