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,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'digest/md5'
2
4
 
3
5
  module WebSocket
@@ -6,7 +8,7 @@ module WebSocket
6
8
  class Client76 < Client75
7
9
  # @see WebSocket::Handshake::Base#valid?
8
10
  def valid?
9
- super && verify_challenge
11
+ super && verify_challenge && verify_protocol
10
12
  end
11
13
 
12
14
  private
@@ -62,22 +64,22 @@ module WebSocket
62
64
  # Verify if challenge sent by server match generated one
63
65
  # @return [Boolena] True if challenge matches, false otherwise(sets appropriate error)
64
66
  def verify_challenge
65
- fail WebSocket::Error::Handshake::InvalidAuthentication unless @handshake.leftovers == challenge
67
+ raise WebSocket::Error::Handshake::InvalidAuthentication unless @handshake.leftovers == challenge
66
68
  true
67
69
  end
68
70
 
69
71
  NOISE_CHARS = ("\x21".."\x2f").to_a + ("\x3a".."\x7e").to_a
70
72
 
71
73
  # Generate Sec-WebSocket-Key1 and Sec-WebSocket-Key2
72
- # @param [String] name of key. Will be used to set number variable needed later. Valid values: key1, key2
74
+ # @param key [String] name of key. Will be used to set number variable needed later. Valid values: key1, key2
73
75
  # @return [String] generated key
74
76
  def generate_key(key)
75
- spaces = 1 + rand(12)
77
+ spaces = rand(1..12)
76
78
  max = 0xffffffff / spaces
77
79
  number = rand(max + 1)
78
80
  instance_variable_set("@#{key}_number", number)
79
81
  key = (number * spaces).to_s
80
- (1 + rand(12)).times do
82
+ rand(1..12).times do
81
83
  char = NOISE_CHARS[rand(NOISE_CHARS.size)]
82
84
  pos = rand(key.size + 1)
83
85
  key[pos...pos] = char
@@ -93,6 +95,10 @@ module WebSocket
93
95
  def generate_key3
94
96
  [rand(0x100000000)].pack('N') + [rand(0x100000000)].pack('N')
95
97
  end
98
+
99
+ def provided_protocols
100
+ Array(@handshake.headers['sec-websocket-protocol'].to_s.strip)
101
+ end
96
102
  end
97
103
  end
98
104
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module WebSocket
2
4
  module Handshake
3
5
  module Handler
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'digest/sha1'
2
4
  require 'base64'
3
5
 
@@ -20,10 +22,10 @@ module WebSocket
20
22
  # @see WebSocket::Handshake::Handler::Base#handshake_keys
21
23
  def handshake_keys
22
24
  [
23
- %w(Upgrade websocket),
24
- %w(Connection Upgrade),
25
+ %w[Upgrade websocket],
26
+ %w[Connection Upgrade],
25
27
  ['Sec-WebSocket-Accept', signature]
26
- ]
28
+ ] + protocol
27
29
  end
28
30
 
29
31
  # Signature of response, created from client request Sec-WebSocket-Key
@@ -35,13 +37,19 @@ module WebSocket
35
37
  end
36
38
 
37
39
  def verify_key
38
- fail WebSocket::Error::Handshake::InvalidAuthentication unless key
40
+ raise WebSocket::Error::Handshake::InvalidAuthentication unless key
39
41
  true
40
42
  end
41
43
 
42
44
  def key
43
45
  @handshake.headers['sec-websocket-key']
44
46
  end
47
+
48
+ def protocol
49
+ return [] unless @handshake.headers.key?('sec-websocket-protocol')
50
+ protos = @handshake.headers['sec-websocket-protocol'].split(/ *, */) & @handshake.protocols
51
+ [['Sec-WebSocket-Protocol', protos.first]]
52
+ end
45
53
  end
46
54
  end
47
55
  end
@@ -1,9 +1,19 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module WebSocket
2
4
  module Handshake
3
5
  module Handler
4
6
  class Server75 < Server
5
7
  private
6
8
 
9
+ def headers
10
+ {
11
+ origin: 'WebSocket-Origin',
12
+ location: 'WebSocket-Location',
13
+ protocol: 'WebSocket-Protocol'
14
+ }.freeze
15
+ end
16
+
7
17
  # @see WebSocket::Handshake::Handler::Base#header_line
8
18
  def header_line
9
19
  'HTTP/1.1 101 Web Socket Protocol Handshake'
@@ -12,11 +22,17 @@ module WebSocket
12
22
  # @see WebSocket::Handshake::Handler::Base#handshake_keys
13
23
  def handshake_keys
14
24
  [
15
- %w(Upgrade WebSocket),
16
- %w(Connection Upgrade),
17
- ['WebSocket-Origin', @handshake.headers['origin']],
18
- ['WebSocket-Location', @handshake.uri]
19
- ]
25
+ %w[Upgrade WebSocket],
26
+ %w[Connection Upgrade],
27
+ [headers[:origin], @handshake.headers['origin']],
28
+ [headers[:location], @handshake.uri]
29
+ ] + protocol
30
+ end
31
+
32
+ def protocol
33
+ return [] unless @handshake.headers.key?(headers[:protocol].downcase)
34
+ proto = @handshake.headers[headers[:protocol].downcase]
35
+ [[headers[:protocol], @handshake.protocols.include?(proto) ? proto : nil]]
20
36
  end
21
37
  end
22
38
  end
@@ -1,9 +1,11 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'digest/md5'
2
4
 
3
5
  module WebSocket
4
6
  module Handshake
5
7
  module Handler
6
- class Server76 < Server
8
+ class Server76 < Server75
7
9
  # @see WebSocket::Handshake::Base#valid?
8
10
  def valid?
9
11
  super && !finishing_line.nil?
@@ -11,6 +13,14 @@ module WebSocket
11
13
 
12
14
  private
13
15
 
16
+ def headers
17
+ {
18
+ origin: 'Sec-WebSocket-Origin',
19
+ location: 'Sec-WebSocket-Location',
20
+ protocol: 'Sec-WebSocket-Protocol'
21
+ }.freeze
22
+ end
23
+
14
24
  # @see WebSocket::Handshake::Base#reserved_leftover_lines
15
25
  def reserved_leftover_lines
16
26
  1
@@ -21,23 +31,11 @@ module WebSocket
21
31
  'HTTP/1.1 101 WebSocket Protocol Handshake'
22
32
  end
23
33
 
24
- # @see WebSocket::Handshake::Handler::Base#handshake_keys
25
- def handshake_keys
26
- [
27
- %w(Upgrade WebSocket),
28
- %w(Connection Upgrade),
29
- ['Sec-WebSocket-Origin', @handshake.headers['origin']],
30
- ['Sec-WebSocket-Location', @handshake.uri]
31
- ]
32
- end
33
-
34
34
  # @see WebSocket::Handshake::Handler::Base#finishing_line
35
35
  def finishing_line
36
36
  @finishing_line ||= challenge_response
37
37
  end
38
38
 
39
- private
40
-
41
39
  # Response to client challenge from request Sec-WebSocket-Key1, Sec-WebSocket-Key2 and leftovers
42
40
  # @return [String] Challenge response or nil if error occured
43
41
  def challenge_response
@@ -60,14 +58,14 @@ module WebSocket
60
58
 
61
59
  spaces = string.scan(/ /).size
62
60
  # As per 5.2.5, abort the connection if spaces are zero.
63
- fail WebSocket::Error::Handshake::InvalidAuthentication if spaces == 0
61
+ raise WebSocket::Error::Handshake::InvalidAuthentication if spaces.zero?
64
62
 
65
63
  # As per 5.2.6, abort if numbers is not an integral multiple of spaces
66
- fail WebSocket::Error::Handshake::InvalidAuthentication if numbers % spaces != 0
64
+ raise WebSocket::Error::Handshake::InvalidAuthentication if numbers % spaces != 0
67
65
 
68
66
  quotient = numbers / spaces
69
67
 
70
- fail WebSocket::Error::Handshake::InvalidAuthentication if quotient > 2**32 - 1
68
+ raise WebSocket::Error::Handshake::InvalidAuthentication if quotient > 2**32 - 1
71
69
 
72
70
  quotient
73
71
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module WebSocket
2
4
  module Handshake
3
5
  # Construct or parse a server WebSocket handshake.
@@ -35,6 +37,7 @@ module WebSocket
35
37
  # @param [Hash] args Arguments for server
36
38
  #
37
39
  # @option args [Boolean] :secure If true then server will use wss:// protocol
40
+ # @option args [Array<String>] :protocols an array of supported sub-protocols
38
41
  #
39
42
  # @example
40
43
  # Websocket::Handshake::Server.new(secure: true)
@@ -70,7 +73,7 @@ module WebSocket
70
73
  # @example
71
74
  # @handshake.from_rack(env)
72
75
  def from_rack(env)
73
- @headers = env.select { |key, _value| key =~ /\AHTTP_/ }.each_with_object({}) do |tuple, memo|
76
+ @headers = env.select { |key, _value| key.to_s.start_with? 'HTTP_' }.each_with_object({}) do |tuple, memo|
74
77
  key, value = tuple
75
78
  memo[key.gsub(/\AHTTP_/, '').tr('_', '-').downcase] = value
76
79
  end
@@ -153,7 +156,7 @@ module WebSocket
153
156
  when 75 then Handler::Server75.new(self)
154
157
  when 76, 0..3 then Handler::Server76.new(self)
155
158
  when 4..17 then Handler::Server04.new(self)
156
- else fail WebSocket::Error::Handshake::UnknownVersion
159
+ else raise WebSocket::Error::Handshake::UnknownVersion
157
160
  end
158
161
  end
159
162
 
@@ -164,9 +167,9 @@ module WebSocket
164
167
  # @return [Boolean] True if parsed correctly. False otherwise
165
168
  def parse_first_line(line)
166
169
  line_parts = line.match(PATH)
167
- fail WebSocket::Error::Handshake::InvalidHeader unless line_parts
170
+ raise WebSocket::Error::Handshake::InvalidHeader unless line_parts
168
171
  method = line_parts[1].strip
169
- fail WebSocket::Error::Handshake::GetRequestRequired unless method == 'GET'
172
+ raise WebSocket::Error::Handshake::GetRequestRequired unless method == 'GET'
170
173
 
171
174
  resource_name = line_parts[2].strip
172
175
  @path, @query = resource_name.split('?', 2)
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module WebSocket
4
+ module NiceInspect
5
+ # Recreate inspect as #to_s will be overwritten
6
+ def inspect
7
+ vars = instance_variables.map { |v| "#{v}=#{instance_variable_get(v).inspect}" }.join(', ')
8
+ insp = Kernel.format("#{self.class}:0x%08x", __id__)
9
+ "<#{insp} #{vars}>"
10
+ end
11
+ end
12
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module WebSocket
2
- VERSION = '1.2.3'
4
+ VERSION = '1.2.9'.freeze
3
5
  end
@@ -1,23 +1,26 @@
1
1
  # encoding: binary
2
+ # frozen_string_literal: true
3
+
2
4
  require 'spec_helper'
3
5
 
4
6
  RSpec.describe 'Incoming frame draft 03' do
7
+ subject { frame }
8
+
5
9
  let(:version) { 3 }
6
10
  let(:frame) { WebSocket::Frame::Incoming.new(version: version, data: encoded_text) }
7
11
  let(:encoded_text) { nil }
8
12
  let(:decoded_text) { nil }
9
13
  let(:frame_type) { nil }
10
14
  let(:error) { nil }
11
- subject { frame }
12
15
 
13
- it_should_behave_like 'valid_incoming_frame'
16
+ it_behaves_like 'valid_incoming_frame'
14
17
 
15
18
  context 'should properly decode close frame' do
16
19
  let(:encoded_text) { "\x01\x05" + decoded_text }
17
20
  let(:frame_type) { :close }
18
21
  let(:decoded_text) { 'Hello' }
19
22
 
20
- it_should_behave_like 'valid_incoming_frame'
23
+ it_behaves_like 'valid_incoming_frame'
21
24
  end
22
25
 
23
26
  context 'should properly decode ping frame' do
@@ -25,7 +28,7 @@ RSpec.describe 'Incoming frame draft 03' do
25
28
  let(:frame_type) { :ping }
26
29
  let(:decoded_text) { 'Hello' }
27
30
 
28
- it_should_behave_like 'valid_incoming_frame'
31
+ it_behaves_like 'valid_incoming_frame'
29
32
  end
30
33
 
31
34
  context 'should properly decode pong frame' do
@@ -33,7 +36,7 @@ RSpec.describe 'Incoming frame draft 03' do
33
36
  let(:frame_type) { :pong }
34
37
  let(:decoded_text) { 'Hello' }
35
38
 
36
- it_should_behave_like 'valid_incoming_frame'
39
+ it_behaves_like 'valid_incoming_frame'
37
40
  end
38
41
 
39
42
  context 'should properly decode text frame' do
@@ -41,7 +44,7 @@ RSpec.describe 'Incoming frame draft 03' do
41
44
  let(:decoded_text) { 'Hello' }
42
45
  let(:frame_type) { :text }
43
46
 
44
- it_should_behave_like 'valid_incoming_frame'
47
+ it_behaves_like 'valid_incoming_frame'
45
48
  end
46
49
 
47
50
  context 'should properly decode text frame with continuation' do
@@ -49,15 +52,15 @@ RSpec.describe 'Incoming frame draft 03' do
49
52
  let(:frame_type) { :text }
50
53
  let(:decoded_text) { 'Hello' }
51
54
 
52
- it_should_behave_like 'valid_incoming_frame'
55
+ it_behaves_like 'valid_incoming_frame'
53
56
  end
54
57
 
55
58
  context 'should properly decode text frame in between of continuation' do
56
59
  let(:encoded_text) { "\x84\x03Hel\x03\x03abc\x00\x02lo" }
57
- let(:frame_type) { [:pong, :text] }
58
- let(:decoded_text) { %w(abc Hello) }
60
+ let(:frame_type) { %i[pong text] }
61
+ let(:decoded_text) { %w[abc Hello] }
59
62
 
60
- it_should_behave_like 'valid_incoming_frame'
63
+ it_behaves_like 'valid_incoming_frame'
61
64
  end
62
65
 
63
66
  context 'should not return unfinished more frame' do
@@ -65,7 +68,7 @@ RSpec.describe 'Incoming frame draft 03' do
65
68
  let(:frame_type) { :pong }
66
69
  let(:decoded_text) { 'abc' }
67
70
 
68
- it_should_behave_like 'valid_incoming_frame'
71
+ it_behaves_like 'valid_incoming_frame'
69
72
  end
70
73
 
71
74
  context 'should properly decode 256 bytes binary frame' do
@@ -73,7 +76,7 @@ RSpec.describe 'Incoming frame draft 03' do
73
76
  let(:frame_type) { :binary }
74
77
  let(:decoded_text) { 'a' * 256 }
75
78
 
76
- it_should_behave_like 'valid_incoming_frame'
79
+ it_behaves_like 'valid_incoming_frame'
77
80
  end
78
81
 
79
82
  context 'should properly decode 64KiB binary frame' do
@@ -81,14 +84,14 @@ RSpec.describe 'Incoming frame draft 03' do
81
84
  let(:frame_type) { :binary }
82
85
  let(:decoded_text) { 'a' * 65_536 }
83
86
 
84
- it_should_behave_like 'valid_incoming_frame'
87
+ it_behaves_like 'valid_incoming_frame'
85
88
  end
86
89
 
87
90
  context 'should wait with incomplete frame' do
88
91
  let(:encoded_text) { "\x04\x06Hello" }
89
92
  let(:decoded_text) { nil }
90
93
 
91
- it_should_behave_like 'valid_incoming_frame'
94
+ it_behaves_like 'valid_incoming_frame'
92
95
  end
93
96
 
94
97
  context 'should raise error with invalid opcode' do
@@ -96,7 +99,7 @@ RSpec.describe 'Incoming frame draft 03' do
96
99
  let(:decoded_text) { nil }
97
100
  let(:error) { WebSocket::Error::Frame::UnknownOpcode }
98
101
 
99
- it_should_behave_like 'valid_incoming_frame'
102
+ it_behaves_like 'valid_incoming_frame'
100
103
  end
101
104
 
102
105
  context 'should raise error with too long frame' do
@@ -104,7 +107,7 @@ RSpec.describe 'Incoming frame draft 03' do
104
107
  let(:decoded_text) { nil }
105
108
  let(:error) { WebSocket::Error::Frame::TooLong }
106
109
 
107
- it_should_behave_like 'valid_incoming_frame'
110
+ it_behaves_like 'valid_incoming_frame'
108
111
  end
109
112
 
110
113
  context 'should raise error with continuation frame without more frame earlier' do
@@ -112,6 +115,6 @@ RSpec.describe 'Incoming frame draft 03' do
112
115
  let(:decoded_text) { nil }
113
116
  let(:error) { WebSocket::Error::Frame::UnexpectedContinuationFrame }
114
117
 
115
- it_should_behave_like 'valid_incoming_frame'
118
+ it_behaves_like 'valid_incoming_frame'
116
119
  end
117
120
  end
@@ -1,23 +1,26 @@
1
1
  # encoding: binary
2
+ # frozen_string_literal: true
3
+
2
4
  require 'spec_helper'
3
5
 
4
6
  RSpec.describe 'Incoming frame draft 04' do
7
+ subject { frame }
8
+
5
9
  let(:version) { 4 }
6
10
  let(:frame) { WebSocket::Frame::Incoming.new(version: version, data: encoded_text) }
7
11
  let(:encoded_text) { nil }
8
12
  let(:decoded_text) { nil }
9
13
  let(:frame_type) { nil }
10
14
  let(:error) { nil }
11
- subject { frame }
12
15
 
13
- it_should_behave_like 'valid_incoming_frame'
16
+ it_behaves_like 'valid_incoming_frame'
14
17
 
15
18
  context 'should properly decode close frame' do
16
19
  let(:encoded_text) { "\x81\x05" + decoded_text }
17
20
  let(:frame_type) { :close }
18
21
  let(:decoded_text) { 'Hello' }
19
22
 
20
- it_should_behave_like 'valid_incoming_frame'
23
+ it_behaves_like 'valid_incoming_frame'
21
24
  end
22
25
 
23
26
  context 'should properly decode ping frame' do
@@ -25,7 +28,7 @@ RSpec.describe 'Incoming frame draft 04' do
25
28
  let(:frame_type) { :ping }
26
29
  let(:decoded_text) { 'Hello' }
27
30
 
28
- it_should_behave_like 'valid_incoming_frame'
31
+ it_behaves_like 'valid_incoming_frame'
29
32
  end
30
33
 
31
34
  context 'should properly decode pong frame' do
@@ -33,7 +36,7 @@ RSpec.describe 'Incoming frame draft 04' do
33
36
  let(:frame_type) { :pong }
34
37
  let(:decoded_text) { 'Hello' }
35
38
 
36
- it_should_behave_like 'valid_incoming_frame'
39
+ it_behaves_like 'valid_incoming_frame'
37
40
  end
38
41
 
39
42
  context 'should properly decode text frame' do
@@ -41,7 +44,7 @@ RSpec.describe 'Incoming frame draft 04' do
41
44
  let(:decoded_text) { 'Hello' }
42
45
  let(:frame_type) { :text }
43
46
 
44
- it_should_behave_like 'valid_incoming_frame'
47
+ it_behaves_like 'valid_incoming_frame'
45
48
  end
46
49
 
47
50
  context 'should properly decode text frame with continuation' do
@@ -49,15 +52,15 @@ RSpec.describe 'Incoming frame draft 04' do
49
52
  let(:frame_type) { :text }
50
53
  let(:decoded_text) { 'Hello' }
51
54
 
52
- it_should_behave_like 'valid_incoming_frame'
55
+ it_behaves_like 'valid_incoming_frame'
53
56
  end
54
57
 
55
58
  context 'should properly decode text frame in between of continuation' do
56
59
  let(:encoded_text) { "\x04\x03Hel\x83\x03abc\x80\x02lo" }
57
- let(:frame_type) { [:pong, :text] }
58
- let(:decoded_text) { %w(abc Hello) }
60
+ let(:frame_type) { %i[pong text] }
61
+ let(:decoded_text) { %w[abc Hello] }
59
62
 
60
- it_should_behave_like 'valid_incoming_frame'
63
+ it_behaves_like 'valid_incoming_frame'
61
64
  end
62
65
 
63
66
  context 'should not return unfinished more frame' do
@@ -65,7 +68,7 @@ RSpec.describe 'Incoming frame draft 04' do
65
68
  let(:frame_type) { :pong }
66
69
  let(:decoded_text) { 'abc' }
67
70
 
68
- it_should_behave_like 'valid_incoming_frame'
71
+ it_behaves_like 'valid_incoming_frame'
69
72
  end
70
73
 
71
74
  context 'should properly decode 256 bytes binary frame' do
@@ -73,7 +76,7 @@ RSpec.describe 'Incoming frame draft 04' do
73
76
  let(:frame_type) { :binary }
74
77
  let(:decoded_text) { 'a' * 256 }
75
78
 
76
- it_should_behave_like 'valid_incoming_frame'
79
+ it_behaves_like 'valid_incoming_frame'
77
80
  end
78
81
 
79
82
  context 'should properly decode 64KiB binary frame' do
@@ -81,14 +84,14 @@ RSpec.describe 'Incoming frame draft 04' do
81
84
  let(:frame_type) { :binary }
82
85
  let(:decoded_text) { 'a' * 65_536 }
83
86
 
84
- it_should_behave_like 'valid_incoming_frame'
87
+ it_behaves_like 'valid_incoming_frame'
85
88
  end
86
89
 
87
90
  context 'should wait with incomplete frame' do
88
91
  let(:encoded_text) { "\x84\x06Hello" }
89
92
  let(:decoded_text) { nil }
90
93
 
91
- it_should_behave_like 'valid_incoming_frame'
94
+ it_behaves_like 'valid_incoming_frame'
92
95
  end
93
96
 
94
97
  context 'should raise error with invalid opcode' do
@@ -96,7 +99,7 @@ RSpec.describe 'Incoming frame draft 04' do
96
99
  let(:decoded_text) { nil }
97
100
  let(:error) { WebSocket::Error::Frame::UnknownOpcode }
98
101
 
99
- it_should_behave_like 'valid_incoming_frame'
102
+ it_behaves_like 'valid_incoming_frame'
100
103
  end
101
104
 
102
105
  context 'should raise error with too long frame' do
@@ -104,7 +107,7 @@ RSpec.describe 'Incoming frame draft 04' do
104
107
  let(:decoded_text) { nil }
105
108
  let(:error) { WebSocket::Error::Frame::TooLong }
106
109
 
107
- it_should_behave_like 'valid_incoming_frame'
110
+ it_behaves_like 'valid_incoming_frame'
108
111
  end
109
112
 
110
113
  context 'should raise error with continuation frame without more frame earlier' do
@@ -112,6 +115,6 @@ RSpec.describe 'Incoming frame draft 04' do
112
115
  let(:decoded_text) { nil }
113
116
  let(:error) { WebSocket::Error::Frame::UnexpectedContinuationFrame }
114
117
 
115
- it_should_behave_like 'valid_incoming_frame'
118
+ it_behaves_like 'valid_incoming_frame'
116
119
  end
117
120
  end