websocket 1.2.3 → 1.2.9

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 (76) hide show
  1. checksums.yaml +5 -5
  2. data/.codeclimate.yml +17 -0
  3. data/.github/workflows/publish.yml +17 -0
  4. data/.rubocop.yml +35 -3
  5. data/.travis.yml +14 -7
  6. data/CHANGELOG.md +24 -0
  7. data/Gemfile +12 -4
  8. data/README.md +3 -2
  9. data/Rakefile +8 -3
  10. data/lib/websocket.rb +4 -1
  11. data/lib/websocket/error.rb +8 -0
  12. data/lib/websocket/exception_handler.rb +3 -1
  13. data/lib/websocket/frame.rb +2 -0
  14. data/lib/websocket/frame/base.rb +5 -9
  15. data/lib/websocket/frame/data.rb +5 -2
  16. data/lib/websocket/frame/handler.rb +2 -0
  17. data/lib/websocket/frame/handler/base.rb +6 -4
  18. data/lib/websocket/frame/handler/handler03.rb +23 -16
  19. data/lib/websocket/frame/handler/handler04.rb +1 -0
  20. data/lib/websocket/frame/handler/handler05.rb +1 -0
  21. data/lib/websocket/frame/handler/handler07.rb +10 -9
  22. data/lib/websocket/frame/handler/handler75.rb +8 -7
  23. data/lib/websocket/frame/incoming.rb +2 -0
  24. data/lib/websocket/frame/incoming/client.rb +2 -0
  25. data/lib/websocket/frame/incoming/server.rb +2 -0
  26. data/lib/websocket/frame/outgoing.rb +3 -1
  27. data/lib/websocket/frame/outgoing/client.rb +2 -0
  28. data/lib/websocket/frame/outgoing/server.rb +2 -0
  29. data/lib/websocket/handshake.rb +2 -0
  30. data/lib/websocket/handshake/base.rb +26 -13
  31. data/lib/websocket/handshake/client.rb +17 -14
  32. data/lib/websocket/handshake/handler.rb +2 -0
  33. data/lib/websocket/handshake/handler/base.rb +2 -0
  34. data/lib/websocket/handshake/handler/client.rb +11 -0
  35. data/lib/websocket/handshake/handler/client01.rb +2 -0
  36. data/lib/websocket/handshake/handler/client04.rb +15 -4
  37. data/lib/websocket/handshake/handler/client11.rb +2 -0
  38. data/lib/websocket/handshake/handler/client75.rb +18 -2
  39. data/lib/websocket/handshake/handler/client76.rb +11 -5
  40. data/lib/websocket/handshake/handler/server.rb +2 -0
  41. data/lib/websocket/handshake/handler/server04.rb +12 -4
  42. data/lib/websocket/handshake/handler/server75.rb +21 -5
  43. data/lib/websocket/handshake/handler/server76.rb +14 -16
  44. data/lib/websocket/handshake/server.rb +7 -4
  45. data/lib/websocket/nice_inspect.rb +12 -0
  46. data/lib/websocket/version.rb +3 -1
  47. data/spec/frame/incoming_03_spec.rb +20 -17
  48. data/spec/frame/incoming_04_spec.rb +20 -17
  49. data/spec/frame/incoming_05_spec.rb +22 -19
  50. data/spec/frame/incoming_07_spec.rb +24 -21
  51. data/spec/frame/incoming_75_spec.rb +13 -10
  52. data/spec/frame/incoming_common_spec.rb +18 -8
  53. data/spec/frame/masking_spec.rb +3 -1
  54. data/spec/frame/outgoing_03_spec.rb +13 -10
  55. data/spec/frame/outgoing_04_spec.rb +13 -10
  56. data/spec/frame/outgoing_05_spec.rb +12 -9
  57. data/spec/frame/outgoing_07_spec.rb +13 -10
  58. data/spec/frame/outgoing_75_spec.rb +8 -5
  59. data/spec/frame/outgoing_common_spec.rb +11 -4
  60. data/spec/handshake/client_04_spec.rb +46 -3
  61. data/spec/handshake/client_11_spec.rb +5 -3
  62. data/spec/handshake/client_75_spec.rb +28 -1
  63. data/spec/handshake/client_76_spec.rb +30 -3
  64. data/spec/handshake/server_04_spec.rb +37 -4
  65. data/spec/handshake/server_75_spec.rb +25 -1
  66. data/spec/handshake/server_76_spec.rb +33 -9
  67. data/spec/spec_helper.rb +2 -2
  68. data/spec/support/all_client_drafts.rb +23 -21
  69. data/spec/support/all_server_drafts.rb +21 -16
  70. data/spec/support/frames_base.rb +2 -0
  71. data/spec/support/handshake_requests.rb +19 -17
  72. data/spec/support/incoming_frames.rb +46 -25
  73. data/spec/support/outgoing_frames.rb +30 -8
  74. data/spec/support/overwrites.rb +2 -0
  75. data/websocket.gemspec +4 -1
  76. metadata +7 -5
@@ -1,17 +1,20 @@
1
1
  # encoding: binary
2
+ # frozen_string_literal: true
3
+
2
4
  require 'spec_helper'
3
5
 
4
6
  RSpec.describe 'Outgoing frame draft 04' do
5
- let(:version) { 04 }
7
+ subject { frame }
8
+
9
+ let(:version) { 4 }
6
10
  let(:frame) { WebSocket::Frame::Outgoing.new(version: version, data: decoded_text, type: frame_type) }
7
11
  let(:decoded_text) { '' }
8
12
  let(:encoded_text) { "\x84\x00" }
9
13
  let(:frame_type) { :text }
10
14
  let(:require_sending) { true }
11
15
  let(:error) { nil }
12
- subject { frame }
13
16
 
14
- it_should_behave_like 'valid_outgoing_frame'
17
+ it_behaves_like 'valid_outgoing_frame'
15
18
 
16
19
  context 'should properly encode close frame' do
17
20
  let(:frame_type) { :close }
@@ -19,7 +22,7 @@ RSpec.describe 'Outgoing frame draft 04' do
19
22
  let(:encoded_text) { "\x81\x05" + decoded_text }
20
23
  let(:require_sending) { true }
21
24
 
22
- it_should_behave_like 'valid_outgoing_frame'
25
+ it_behaves_like 'valid_outgoing_frame'
23
26
  end
24
27
 
25
28
  context 'should properly encode ping frame' do
@@ -28,7 +31,7 @@ RSpec.describe 'Outgoing frame draft 04' do
28
31
  let(:encoded_text) { "\x82\x05" + decoded_text }
29
32
  let(:require_sending) { true }
30
33
 
31
- it_should_behave_like 'valid_outgoing_frame'
34
+ it_behaves_like 'valid_outgoing_frame'
32
35
  end
33
36
 
34
37
  context 'should properly encode pong frame' do
@@ -37,7 +40,7 @@ RSpec.describe 'Outgoing frame draft 04' do
37
40
  let(:encoded_text) { "\x83\x05" + decoded_text }
38
41
  let(:require_sending) { true }
39
42
 
40
- it_should_behave_like 'valid_outgoing_frame'
43
+ it_behaves_like 'valid_outgoing_frame'
41
44
  end
42
45
 
43
46
  context 'should properly encode text frame' do
@@ -45,7 +48,7 @@ RSpec.describe 'Outgoing frame draft 04' do
45
48
  let(:encoded_text) { "\x84\x05" + decoded_text }
46
49
  let(:require_sending) { true }
47
50
 
48
- it_should_behave_like 'valid_outgoing_frame'
51
+ it_behaves_like 'valid_outgoing_frame'
49
52
  end
50
53
 
51
54
  context 'should properly encode 256 bytes binary frame' do
@@ -54,7 +57,7 @@ RSpec.describe 'Outgoing frame draft 04' do
54
57
  let(:encoded_text) { "\x85\x7E\x01\x00" + decoded_text }
55
58
  let(:require_sending) { true }
56
59
 
57
- it_should_behave_like 'valid_outgoing_frame'
60
+ it_behaves_like 'valid_outgoing_frame'
58
61
  end
59
62
 
60
63
  context 'should properly encode 64KiB binary frame' do
@@ -63,7 +66,7 @@ RSpec.describe 'Outgoing frame draft 04' do
63
66
  let(:encoded_text) { "\x85\x7F\x00\x00\x00\x00\x00\x01\x00\x00" + decoded_text }
64
67
  let(:require_sending) { true }
65
68
 
66
- it_should_behave_like 'valid_outgoing_frame'
69
+ it_behaves_like 'valid_outgoing_frame'
67
70
  end
68
71
 
69
72
  context 'should return error for unknown frame type' do
@@ -73,6 +76,6 @@ RSpec.describe 'Outgoing frame draft 04' do
73
76
  let(:error) { :unknown_frame_type }
74
77
  let(:require_sending) { false }
75
78
 
76
- it_should_behave_like 'valid_outgoing_frame'
79
+ it_behaves_like 'valid_outgoing_frame'
77
80
  end
78
81
  end
@@ -1,7 +1,11 @@
1
1
  # encoding: binary
2
+ # frozen_string_literal: true
3
+
2
4
  require 'spec_helper'
3
5
 
4
6
  RSpec.describe 'Outgoing frame draft 05' do
7
+ subject { frame }
8
+
5
9
  let(:version) { 5 }
6
10
  let(:frame) { WebSocket::Frame::Outgoing.new(version: version, data: decoded_text, type: frame_type) }
7
11
  let(:decoded_text) { '' }
@@ -9,9 +13,8 @@ RSpec.describe 'Outgoing frame draft 05' do
9
13
  let(:frame_type) { :text }
10
14
  let(:require_sending) { true }
11
15
  let(:error) { nil }
12
- subject { frame }
13
16
 
14
- it_should_behave_like 'valid_outgoing_frame'
17
+ it_behaves_like 'valid_outgoing_frame'
15
18
 
16
19
  context 'should properly encode close frame' do
17
20
  let(:frame_type) { :close }
@@ -19,7 +22,7 @@ RSpec.describe 'Outgoing frame draft 05' do
19
22
  let(:encoded_text) { "\x81\x05" + decoded_text }
20
23
  let(:require_sending) { true }
21
24
 
22
- it_should_behave_like 'valid_outgoing_frame'
25
+ it_behaves_like 'valid_outgoing_frame'
23
26
  end
24
27
 
25
28
  context 'should properly encode ping frame' do
@@ -28,7 +31,7 @@ RSpec.describe 'Outgoing frame draft 05' do
28
31
  let(:encoded_text) { "\x82\x05" + decoded_text }
29
32
  let(:require_sending) { true }
30
33
 
31
- it_should_behave_like 'valid_outgoing_frame'
34
+ it_behaves_like 'valid_outgoing_frame'
32
35
  end
33
36
 
34
37
  context 'should properly encode pong frame' do
@@ -37,7 +40,7 @@ RSpec.describe 'Outgoing frame draft 05' do
37
40
  let(:encoded_text) { "\x83\x05" + decoded_text }
38
41
  let(:require_sending) { true }
39
42
 
40
- it_should_behave_like 'valid_outgoing_frame'
43
+ it_behaves_like 'valid_outgoing_frame'
41
44
  end
42
45
 
43
46
  context 'should properly encode text frame' do
@@ -45,7 +48,7 @@ RSpec.describe 'Outgoing frame draft 05' do
45
48
  let(:encoded_text) { "\x84\x05" + decoded_text }
46
49
  let(:require_sending) { true }
47
50
 
48
- it_should_behave_like 'valid_outgoing_frame'
51
+ it_behaves_like 'valid_outgoing_frame'
49
52
  end
50
53
 
51
54
  context 'should properly encode 256 bytes binary frame' do
@@ -54,7 +57,7 @@ RSpec.describe 'Outgoing frame draft 05' do
54
57
  let(:encoded_text) { "\x85\x7E\x01\x00" + decoded_text }
55
58
  let(:require_sending) { true }
56
59
 
57
- it_should_behave_like 'valid_outgoing_frame'
60
+ it_behaves_like 'valid_outgoing_frame'
58
61
  end
59
62
 
60
63
  context 'should properly encode 64KiB binary frame' do
@@ -63,7 +66,7 @@ RSpec.describe 'Outgoing frame draft 05' do
63
66
  let(:encoded_text) { "\x85\x7F\x00\x00\x00\x00\x00\x01\x00\x00" + decoded_text }
64
67
  let(:require_sending) { true }
65
68
 
66
- it_should_behave_like 'valid_outgoing_frame'
69
+ it_behaves_like 'valid_outgoing_frame'
67
70
  end
68
71
 
69
72
  context 'should return error for unknown frame type' do
@@ -73,6 +76,6 @@ RSpec.describe 'Outgoing frame draft 05' do
73
76
  let(:error) { :unknown_frame_type }
74
77
  let(:require_sending) { false }
75
78
 
76
- it_should_behave_like 'valid_outgoing_frame'
79
+ it_behaves_like 'valid_outgoing_frame'
77
80
  end
78
81
  end
@@ -1,7 +1,11 @@
1
1
  # encoding: binary
2
+ # frozen_string_literal: true
3
+
2
4
  require 'spec_helper'
3
5
 
4
6
  RSpec.describe 'Outgoing frame draft 07' do
7
+ subject { frame }
8
+
5
9
  let(:version) { 7 }
6
10
  let(:frame) { WebSocket::Frame::Outgoing.new(version: version, data: decoded_text, type: frame_type, code: close_code) }
7
11
  let(:decoded_text) { '' }
@@ -10,9 +14,8 @@ RSpec.describe 'Outgoing frame draft 07' do
10
14
  let(:frame_type) { :text }
11
15
  let(:require_sending) { true }
12
16
  let(:error) { nil }
13
- subject { frame }
14
17
 
15
- it_should_behave_like 'valid_outgoing_frame'
18
+ it_behaves_like 'valid_outgoing_frame'
16
19
 
17
20
  context 'should properly encode close frame without close code' do
18
21
  let(:frame_type) { :close }
@@ -20,7 +23,7 @@ RSpec.describe 'Outgoing frame draft 07' do
20
23
  let(:encoded_text) { "\x88\x07\x03\xE8" + decoded_text }
21
24
  let(:require_sending) { true }
22
25
 
23
- it_should_behave_like 'valid_outgoing_frame'
26
+ it_behaves_like 'valid_outgoing_frame'
24
27
  end
25
28
 
26
29
  context 'should properly encode close frame with close code' do
@@ -30,7 +33,7 @@ RSpec.describe 'Outgoing frame draft 07' do
30
33
  let(:encoded_text) { "\x88\x07\x03\xE9" + decoded_text }
31
34
  let(:require_sending) { true }
32
35
 
33
- it_should_behave_like 'valid_outgoing_frame'
36
+ it_behaves_like 'valid_outgoing_frame'
34
37
  end
35
38
 
36
39
  context 'should properly encode ping frame' do
@@ -39,7 +42,7 @@ RSpec.describe 'Outgoing frame draft 07' do
39
42
  let(:encoded_text) { "\x89\x05" + decoded_text }
40
43
  let(:require_sending) { true }
41
44
 
42
- it_should_behave_like 'valid_outgoing_frame'
45
+ it_behaves_like 'valid_outgoing_frame'
43
46
  end
44
47
 
45
48
  context 'should properly encode pong frame' do
@@ -48,7 +51,7 @@ RSpec.describe 'Outgoing frame draft 07' do
48
51
  let(:encoded_text) { "\x8a\x05" + decoded_text }
49
52
  let(:require_sending) { true }
50
53
 
51
- it_should_behave_like 'valid_outgoing_frame'
54
+ it_behaves_like 'valid_outgoing_frame'
52
55
  end
53
56
 
54
57
  context 'should properly encode text frame' do
@@ -56,7 +59,7 @@ RSpec.describe 'Outgoing frame draft 07' do
56
59
  let(:encoded_text) { "\x81\x05" + decoded_text }
57
60
  let(:require_sending) { true }
58
61
 
59
- it_should_behave_like 'valid_outgoing_frame'
62
+ it_behaves_like 'valid_outgoing_frame'
60
63
  end
61
64
 
62
65
  context 'should properly encode 256 bytes binary frame' do
@@ -65,7 +68,7 @@ RSpec.describe 'Outgoing frame draft 07' do
65
68
  let(:encoded_text) { "\x82\x7E\x01\x00" + decoded_text }
66
69
  let(:require_sending) { true }
67
70
 
68
- it_should_behave_like 'valid_outgoing_frame'
71
+ it_behaves_like 'valid_outgoing_frame'
69
72
  end
70
73
 
71
74
  context 'should properly encode 64KiB binary frame' do
@@ -74,7 +77,7 @@ RSpec.describe 'Outgoing frame draft 07' do
74
77
  let(:encoded_text) { "\x82\x7F\x00\x00\x00\x00\x00\x01\x00\x00" + decoded_text }
75
78
  let(:require_sending) { true }
76
79
 
77
- it_should_behave_like 'valid_outgoing_frame'
80
+ it_behaves_like 'valid_outgoing_frame'
78
81
  end
79
82
 
80
83
  context 'should return error for unknown frame type' do
@@ -84,6 +87,6 @@ RSpec.describe 'Outgoing frame draft 07' do
84
87
  let(:error) { :unknown_frame_type }
85
88
  let(:require_sending) { false }
86
89
 
87
- it_should_behave_like 'valid_outgoing_frame'
90
+ it_behaves_like 'valid_outgoing_frame'
88
91
  end
89
92
  end
@@ -1,7 +1,11 @@
1
1
  # encoding: binary
2
+ # frozen_string_literal: true
3
+
2
4
  require 'spec_helper'
3
5
 
4
6
  RSpec.describe 'Outgoing frame draft 75' do
7
+ subject { frame }
8
+
5
9
  let(:version) { 75 }
6
10
  let(:frame) { WebSocket::Frame::Outgoing.new(version: version, data: decoded_text, type: frame_type) }
7
11
  let(:decoded_text) { '' }
@@ -9,16 +13,15 @@ RSpec.describe 'Outgoing frame draft 75' do
9
13
  let(:frame_type) { :text }
10
14
  let(:require_sending) { true }
11
15
  let(:error) { nil }
12
- subject { frame }
13
16
 
14
- it_should_behave_like 'valid_outgoing_frame'
17
+ it_behaves_like 'valid_outgoing_frame'
15
18
 
16
19
  context 'should properly encode text frame' do
17
20
  let(:decoded_text) { 'abc' }
18
21
  let(:encoded_text) { "\x00abc\xFF" }
19
22
  let(:require_sending) { true }
20
23
 
21
- it_should_behave_like 'valid_outgoing_frame'
24
+ it_behaves_like 'valid_outgoing_frame'
22
25
  end
23
26
 
24
27
  context 'should properly encode close frame' do
@@ -27,7 +30,7 @@ RSpec.describe 'Outgoing frame draft 75' do
27
30
  let(:encoded_text) { "\xFF\x00" }
28
31
  let(:require_sending) { true }
29
32
 
30
- it_should_behave_like 'valid_outgoing_frame'
33
+ it_behaves_like 'valid_outgoing_frame'
31
34
  end
32
35
 
33
36
  context 'should return error for unknown frame type' do
@@ -37,6 +40,6 @@ RSpec.describe 'Outgoing frame draft 75' do
37
40
  let(:error) { :unknown_frame_type }
38
41
  let(:require_sending) { false }
39
42
 
40
- it_should_behave_like 'valid_outgoing_frame'
43
+ it_behaves_like 'valid_outgoing_frame'
41
44
  end
42
45
  end
@@ -1,15 +1,22 @@
1
1
  # encoding: binary
2
+ # frozen_string_literal: true
3
+
2
4
  require 'spec_helper'
3
5
 
4
6
  RSpec.describe 'Outgoing common frame' do
5
7
  subject { WebSocket::Frame::Outgoing.new }
6
8
 
7
- its(:version) { is_expected.to eql(13) }
8
- its(:error?) { is_expected.to be false }
9
+ it 'is version 13' do
10
+ expect(subject.version).to be 13
11
+ end
12
+
13
+ it 'has no errors' do
14
+ expect(subject.error?).to be false
15
+ end
9
16
 
10
- it 'should raise error on invalid version' do
17
+ it 'raises error on invalid version' do
11
18
  subject = WebSocket::Frame::Incoming.new(version: 70)
12
19
  expect(subject.error?).to be true
13
- expect(subject.error).to eql(:unknown_protocol_version)
20
+ expect(subject.error).to be :unknown_protocol_version
14
21
  end
15
22
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  RSpec.describe 'Client draft 4 handshake' do
@@ -7,14 +9,55 @@ RSpec.describe 'Client draft 4 handshake' do
7
9
  let(:client_request) { client_handshake_04({ key: handshake.handler.send(:key), version: version }.merge(@request_params || {})) }
8
10
  let(:server_response) { server_handshake_04({ accept: handshake.handler.send(:accept) }.merge(@request_params || {})) }
9
11
 
10
- it_should_behave_like 'all client drafts'
12
+ it_behaves_like 'all client drafts'
11
13
 
12
- it 'should disallow client with invalid challenge' do
14
+ it 'disallows client with invalid challenge' do
13
15
  @request_params = { accept: 'invalid' }
14
16
  handshake << server_response
15
17
 
16
18
  expect(handshake).to be_finished
17
19
  expect(handshake).not_to be_valid
18
- expect(handshake.error).to eql(:invalid_handshake_authentication)
20
+ expect(handshake.error).to be(:invalid_handshake_authentication)
21
+ end
22
+
23
+ context 'protocol header specified' do
24
+ let(:handshake) { WebSocket::Handshake::Client.new(uri: 'ws://example.com/demo', origin: 'http://example.com', version: version, protocols: protocols) }
25
+
26
+ context 'single protocol requested' do
27
+ let(:protocols) { %w[binary] }
28
+
29
+ it 'returns a valid handshake' do
30
+ @request_params = { headers: { 'Sec-WebSocket-Protocol' => 'binary' } }
31
+ handshake << server_response
32
+
33
+ expect(handshake).to be_finished
34
+ expect(handshake).to be_valid
35
+ end
36
+ end
37
+
38
+ context 'multiple protocols requested' do
39
+ let(:protocols) { %w[binary xmpp] }
40
+
41
+ it 'returns with a valid handshake' do
42
+ @request_params = { headers: { 'Sec-WebSocket-Protocol' => 'xmpp' } }
43
+ handshake << server_response
44
+
45
+ expect(handshake).to be_finished
46
+ expect(handshake).to be_valid
47
+ end
48
+ end
49
+
50
+ context 'unsupported protocol requested' do
51
+ let(:protocols) { %w[binary xmpp] }
52
+
53
+ it 'fails with an unsupported protocol error' do
54
+ @request_params = { headers: { 'Sec-WebSocket-Protocol' => 'generic' } }
55
+ handshake << server_response
56
+
57
+ expect(handshake).to be_finished
58
+ expect(handshake).not_to be_valid
59
+ expect(handshake.error).to be(:unsupported_protocol)
60
+ end
61
+ end
19
62
  end
20
63
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  RSpec.describe 'Client draft 11 handshake' do
@@ -7,14 +9,14 @@ RSpec.describe 'Client draft 11 handshake' do
7
9
  let(:client_request) { client_handshake_11({ key: handshake.handler.send(:key), version: version }.merge(@request_params || {})) }
8
10
  let(:server_response) { server_handshake_11({ accept: handshake.handler.send(:accept) }.merge(@request_params || {})) }
9
11
 
10
- it_should_behave_like 'all client drafts'
12
+ it_behaves_like 'all client drafts'
11
13
 
12
- it 'should disallow client with invalid challenge' do
14
+ it 'disallows client with invalid challenge' do
13
15
  @request_params = { accept: 'invalid' }
14
16
  handshake << server_response
15
17
 
16
18
  expect(handshake).to be_finished
17
19
  expect(handshake).not_to be_valid
18
- expect(handshake.error).to eql(:invalid_handshake_authentication)
20
+ expect(handshake.error).to be(:invalid_handshake_authentication)
19
21
  end
20
22
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  RSpec.describe 'Client draft 75 handshake' do
@@ -7,5 +9,30 @@ RSpec.describe 'Client draft 75 handshake' do
7
9
  let(:client_request) { client_handshake_75(@request_params || {}) }
8
10
  let(:server_response) { server_handshake_75(@request_params || {}) }
9
11
 
10
- it_should_behave_like 'all client drafts'
12
+ it_behaves_like 'all client drafts'
13
+
14
+ context 'protocol header specified' do
15
+ let(:handshake) { WebSocket::Handshake::Client.new(uri: 'ws://example.com/demo', origin: 'http://example.com', version: version, protocols: %w[binary]) }
16
+
17
+ context 'supported' do
18
+ it 'returns a valid handshake' do
19
+ @request_params = { headers: { 'WebSocket-Protocol' => 'binary' } }
20
+ handshake << server_response
21
+
22
+ expect(handshake).to be_finished
23
+ expect(handshake).to be_valid
24
+ end
25
+ end
26
+
27
+ context 'unsupported' do
28
+ it 'fails with an unsupported protocol error' do
29
+ @request_params = { headers: { 'WebSocket-Protocol' => 'xmpp' } }
30
+ handshake << server_response
31
+
32
+ expect(handshake).to be_finished
33
+ expect(handshake).not_to be_valid
34
+ expect(handshake.error).to be(:unsupported_protocol)
35
+ end
36
+ end
37
+ end
11
38
  end