websocket-rack 0.3.2 → 0.3.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.
data/.travis.yml CHANGED
@@ -2,5 +2,7 @@ script: "bundle exec rake spec"
2
2
  rvm:
3
3
  - 1.8.7
4
4
  - 1.9.2
5
+ - 1.9.3
5
6
  - ree
6
- - rbx
7
+ - rbx-18mode
8
+ # - rbx-19mode
data/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.3.3 / 2012-02-16
4
+
5
+ - postponse sending messages and closing connection to next tick(prevent locking rest of current request)
6
+ - support for WebSocket drafts 09-13 (currently proposed as standard)
7
+ - prevent blocking tests when invalid responsed is received
8
+
3
9
  ## 0.3.2 / 2011-12-13
4
10
 
5
11
  - fix bug that resulted in 'location mismatch' error on Safari and iOS
data/README.md CHANGED
@@ -164,7 +164,8 @@ end
164
164
 
165
165
  ### Which WebSocket drafts are supported:
166
166
 
167
- Currently we support drafts -75 and -76 form old(hixie) numeration and all drafts from -00 to -08 from current(ietf-hybi) numeration.
167
+ Currently we support drafts -75 and -76 form old(hixie) numeration and all drafts from -00 to -13 from current(ietf-hybi) numeration.
168
+ Please note that ietf-hybi-13 is currently proposed as final standard.
168
169
 
169
170
  ### Which Rack servers are supported?
170
171
 
@@ -192,4 +193,4 @@ This is bug in EventMachine < 1.0.0. Please consider updating to newer version o
192
193
 
193
194
  Author: Bernard Potocki <<bernard.potocki@imanel.org>>
194
195
 
195
- Released under MIT license.
196
+ Released under MIT license.
@@ -22,13 +22,17 @@ module Rack
22
22
  # Overwrite send_data from EventMachine
23
23
  # delegate send_data to rack server
24
24
  def send_data(*args)
25
- @socket.send_data(*args)
25
+ EM.next_tick do
26
+ @socket.send_data(*args)
27
+ end
26
28
  end
27
29
 
28
30
  # Overwrite close_connection from EventMachine
29
31
  # delegate close_connection to rack server
30
32
  def close_connection(*args)
31
- @socket.close_connection(*args)
33
+ EM.next_tick do
34
+ @socket.close_connection(*args)
35
+ end
32
36
  end
33
37
 
34
38
  #########################
@@ -1,5 +1,5 @@
1
1
  module Rack
2
2
  module WebSocket
3
- VERSION = "0.3.2"
3
+ VERSION = "0.3.3"
4
4
  end
5
- end
5
+ end
@@ -1,8 +1,9 @@
1
+ require 'timeout'
1
2
  shared_examples_for 'all drafts' do
2
3
  it "should accept incoming connection" do
3
4
  conn = new_server_connection
4
5
  conn.write(handshake_request)
5
- conn.read(handshake_response.length).should eql(handshake_response)
6
+ timeout(1) { conn.read(handshake_response.length).should eql(handshake_response) }
6
7
  end
7
8
  it "should call 'on_open' on new connection" do
8
9
  TestApp.any_instance.expects(:on_open)
@@ -30,14 +31,14 @@ shared_examples_for 'all drafts' do
30
31
  TestApp.any_instance.expects(:on_message)
31
32
  conn = new_server_connection
32
33
  conn.write(handshake_request)
33
- conn.read(handshake_response.length)
34
+ timeout(1) { conn.read(handshake_response.length) }
34
35
  conn.write(message)
35
36
  end
36
37
  it "should call 'on_message' on connection sending data with proper env and message" do
37
38
  TestApp.any_instance.expects(:on_message).once.with { |env, message| env.class == Hash && !env.keys.empty? && message == 'Hello' }
38
39
  conn = new_server_connection
39
40
  conn.write(handshake_request)
40
- conn.read(handshake_response.length)
41
+ timeout(1) { conn.read(handshake_response.length) }
41
42
  conn.write(message)
42
43
  end
43
- end
44
+ end
@@ -4,66 +4,77 @@ shared_examples_for 'all handlers' do
4
4
  conn.write(flash_policy_request)
5
5
  conn.read(flash_policy_response.length).should eql(flash_policy_response)
6
6
  end
7
-
7
+
8
8
  context 'for draft75' do
9
9
  let(:handshake_request) { spec75_handshake_request }
10
10
  let(:handshake_response) { spec75_handshake_response }
11
11
  let(:message) { spec75_message }
12
-
12
+
13
13
  it_should_behave_like 'all drafts'
14
14
  end
15
-
15
+
16
16
  # Also draft00
17
17
  context 'for draft76' do
18
18
  let(:handshake_request) { spec76_handshake_request }
19
19
  let(:handshake_response) { spec76_handshake_response }
20
20
  let(:message) { spec76_message }
21
-
21
+
22
22
  it_should_behave_like 'all drafts'
23
23
  end
24
-
24
+
25
25
  # Drafts 01, 02 and 03 are pretty the same so one test for all
26
26
  context 'for draft03' do
27
27
  let(:handshake_request) { spec03_handshake_request }
28
28
  let(:handshake_response) { spec03_handshake_response }
29
29
  let(:message) { spec03_message }
30
-
30
+
31
31
  it_should_behave_like 'all drafts'
32
32
  end
33
-
33
+
34
34
  context 'for draft05' do
35
35
  let(:handshake_request) { spec05_handshake_request }
36
36
  let(:handshake_response) { spec05_handshake_response }
37
37
  let(:message) { spec05_message }
38
-
38
+
39
39
  it_should_behave_like 'all drafts'
40
40
  end
41
-
41
+
42
42
  context 'for draft06' do
43
43
  let(:handshake_request) { spec06_handshake_request }
44
44
  let(:handshake_response) { spec06_handshake_response }
45
45
  let(:message) { spec06_message }
46
-
46
+
47
47
  it_should_behave_like 'all drafts'
48
48
  end
49
-
49
+
50
50
  context 'for draft07' do
51
51
  let(:handshake_request) { spec07_handshake_request }
52
52
  let(:handshake_response) { spec07_handshake_response }
53
53
  let(:message) { spec07_unmasked_message }
54
54
  let(:masked_message) { spec07_masked_message }
55
-
55
+
56
56
  it_should_behave_like 'all drafts'
57
57
  it_should_behave_like 'draft with masked messages'
58
58
  end
59
-
59
+
60
60
  context 'for draft08' do
61
61
  let(:handshake_request) { spec08_handshake_request }
62
62
  let(:handshake_response) { spec08_handshake_response }
63
63
  let(:message) { spec08_unmasked_message }
64
64
  let(:masked_message) { spec08_masked_message }
65
-
65
+
66
66
  it_should_behave_like 'all drafts'
67
67
  it_should_behave_like 'draft with masked messages'
68
68
  end
69
- end
69
+
70
+ # Drafts 09, 10, 11, 12 and 13 are pretty the same so one test for all
71
+ context 'for draft13' do
72
+ let(:handshake_request) { spec13_handshake_request }
73
+ let(:handshake_response) { spec13_handshake_response }
74
+ let(:message) { spec13_unmasked_message }
75
+ let(:masked_message) { spec13_masked_message }
76
+
77
+ it_should_behave_like 'all drafts'
78
+ it_should_behave_like 'draft with masked messages'
79
+ end
80
+ end
@@ -3,7 +3,7 @@ shared_examples_for 'draft with masked messages' do
3
3
  TestApp.any_instance.expects(:on_message).once.with { |env, message| env.class == Hash && !env.keys.empty? && message == 'Hello' }
4
4
  conn = new_server_connection
5
5
  conn.write(handshake_request)
6
- conn.read(handshake_response.length)
6
+ timeout(1) { conn.read(handshake_response.length) }
7
7
  conn.write(masked_message)
8
8
  end
9
- end
9
+ end
@@ -216,3 +216,34 @@ end
216
216
  def spec08_masked_message
217
217
  "\x81\x85\x37\xfa\x21\x3d\x7f\x9f\x4d\x51\x58"
218
218
  end
219
+
220
+ def spec13_handshake_request
221
+ <<-EOF
222
+ GET /chat HTTP/1.1\r
223
+ Host: localhost:#{TEST_PORT}\r
224
+ Upgrade: websocket\r
225
+ Connection: Upgrade\r
226
+ Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r
227
+ Origin: http://localhost:#{TEST_PORT}\r
228
+ Sec-WebSocket-Protocol: chat, superchat\r
229
+ Sec-WebSocket-Version: 13\r
230
+ \r
231
+ EOF
232
+ end
233
+
234
+ def spec13_handshake_response
235
+ <<-EOF
236
+ HTTP/1.1 101 Switching Protocols\r
237
+ Upgrade: websocket\r
238
+ Connection: Upgrade\r
239
+ Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=\r
240
+ EOF
241
+ end
242
+
243
+ def spec13_unmasked_message
244
+ "\x81\x05\x48\x65\x6c\x6c\x6f"
245
+ end
246
+
247
+ def spec13_masked_message
248
+ "\x81\x85\x37\xfa\x21\x3d\x7f\x9f\x4d\x51\x58"
249
+ end
@@ -13,7 +13,7 @@ Gem::Specification.new do |s|
13
13
  s.description = %q{Rack-based WebSocket server}
14
14
 
15
15
  s.add_dependency 'rack'
16
- s.add_dependency 'em-websocket', '~> 0.3.1'
16
+ s.add_dependency 'em-websocket', '~> 0.3.6'
17
17
  s.add_dependency 'thin' # Temporary until we support more servers
18
18
  s.add_development_dependency 'rspec', '~> 2.4.0'
19
19
  s.add_development_dependency 'mocha'
@@ -22,4 +22,4 @@ Gem::Specification.new do |s|
22
22
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
23
23
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
24
24
  s.require_paths = ["lib"]
25
- end
25
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: websocket-rack
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.2
4
+ version: 0.3.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-12-13 00:00:00.000000000Z
12
+ date: 2012-02-16 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rack
16
- requirement: &70149318123920 !ruby/object:Gem::Requirement
16
+ requirement: &70187912377380 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,21 +21,21 @@ dependencies:
21
21
  version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70149318123920
24
+ version_requirements: *70187912377380
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: em-websocket
27
- requirement: &70149318117000 !ruby/object:Gem::Requirement
27
+ requirement: &70187912376880 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
31
31
  - !ruby/object:Gem::Version
32
- version: 0.3.1
32
+ version: 0.3.6
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *70149318117000
35
+ version_requirements: *70187912376880
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: thin
38
- requirement: &70149318116520 !ruby/object:Gem::Requirement
38
+ requirement: &70187912376460 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '0'
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *70149318116520
46
+ version_requirements: *70187912376460
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: rspec
49
- requirement: &70149318115880 !ruby/object:Gem::Requirement
49
+ requirement: &70187912375920 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ~>
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: 2.4.0
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *70149318115880
57
+ version_requirements: *70187912375920
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: mocha
60
- requirement: &70149318115140 !ruby/object:Gem::Requirement
60
+ requirement: &70187912375500 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ! '>='
@@ -65,7 +65,7 @@ dependencies:
65
65
  version: '0'
66
66
  type: :development
67
67
  prerelease: false
68
- version_requirements: *70149318115140
68
+ version_requirements: *70187912375500
69
69
  description: Rack-based WebSocket server
70
70
  email:
71
71
  - bernard.potocki@imanel.org