@@ -21,7 +21,6 @@ class Frame
2121
2222 OPCODE = 0
2323
24- # @parameter length [Integer] The length of the payload, or nil if the header has not been read yet.
2524 # @parameter mask [Boolean | String] An optional 4-byte string which is used to mask the payload.
2625 def initialize ( finished = true , payload = nil , flags : 0 , opcode : self . class ::OPCODE , mask : false )
2726 if mask == true
@@ -32,7 +31,6 @@ def initialize(finished = true, payload = nil, flags: 0, opcode: self.class::OPC
3231 @flags = flags
3332 @opcode = opcode
3433 @mask = mask
35- @length = payload &.bytesize
3634 @payload = payload
3735 end
3836
@@ -51,9 +49,9 @@ def <=> other
5149 end
5250
5351 # Convert this frame to an array of its fields for comparison or inspection.
54- # @returns [Array] An array of `[finished, flags, opcode, mask, length, payload]`.
52+ # @returns [Array] An array of `[finished, flags, opcode, mask, payload]`.
5553 def to_ary
56- [ @finished , @flags , @opcode , @mask , @length , @ payload]
54+ [ @finished , @flags , @opcode , @mask , @payload ]
5755 end
5856
5957 # Check whether this is a control frame (opcode has bit 3 set).
@@ -104,9 +102,14 @@ def continued?
104102 attr_accessor :flags
105103 attr_accessor :opcode
106104 attr_accessor :mask
107- attr_accessor :length
108105 attr_accessor :payload
109106
107+ # The byte length of the payload.
108+ # @returns [Integer | nil]
109+ def length
110+ @payload &.bytesize
111+ end
112+
110113 if IO . const_defined? ( :Buffer ) && IO ::Buffer . respond_to? ( :for ) && IO ::Buffer . method_defined? ( :xor! )
111114 private def mask_xor ( data , mask )
112115 buffer = data . dup
@@ -135,18 +138,14 @@ def continued?
135138 # @parameter data [String] The payload data to pack.
136139 # @returns [Frame] Returns `self`.
137140 def pack ( data = "" )
138- length = data . bytesize
139-
140- if length . bit_length > 63
141- raise ProtocolError , "Frame length #{ @length } bigger than allowed maximum!"
141+ if data . bytesize . bit_length > 63
142+ raise ProtocolError , "Frame length #{ data . bytesize } bigger than allowed maximum!"
142143 end
143144
144145 if @mask
145- @payload = mask_xor ( data , mask )
146- @length = length
146+ @payload = mask_xor ( data , @mask )
147147 else
148148 @payload = data
149- @length = length
150149 end
151150
152151 return self
@@ -167,45 +166,6 @@ def unpack
167166 def apply ( connection )
168167 connection . receive_frame ( self )
169168 end
170-
171- # Write this frame to the given stream.
172- # @parameter stream [IO] The stream to write the serialized frame to.
173- # @raises [ProtocolError] If the frame has invalid length or mask.
174- def write ( stream )
175- buffer = String . new ( encoding : Encoding ::BINARY )
176-
177- if @payload &.bytesize != @length
178- raise ProtocolError , "Invalid payload length: #{ @length } != #{ @payload . bytesize } for #{ self } !"
179- end
180-
181- if @mask and @mask . bytesize != 4
182- raise ProtocolError , "Invalid mask length!"
183- end
184-
185- if length <= 125
186- short_length = length
187- elsif length . bit_length <= 16
188- short_length = 126
189- else
190- short_length = 127
191- end
192-
193- buffer << [
194- ( @finished ? 0b1000_0000 : 0 ) | ( @flags << 4 ) | @opcode ,
195- ( @mask ? 0b1000_0000 : 0 ) | short_length ,
196- ] . pack ( "CC" )
197-
198- if short_length == 126
199- buffer << [ @length ] . pack ( "n" )
200- elsif short_length == 127
201- buffer << [ @length ] . pack ( "Q>" )
202- end
203-
204- buffer << @mask if @mask
205-
206- stream . write ( buffer )
207- stream . write ( @payload )
208- end
209169 end
210170 end
211171end
0 commit comments