@@ -173,15 +173,15 @@ def apply(connection)
173173 # @returns [Array] A tuple of `[finished, flags, opcode]`.
174174 # @raises [ProtocolError] If the opcode is a reserved non-control or control opcode.
175175 def self . parse_header ( buffer )
176- byte = buffer . unpack ( "C" ) . first
176+ byte = buffer . getbyte ( 0 )
177177
178178 finished = ( byte & 0b1000_0000 != 0 )
179179 flags = ( byte & 0b0111_0000 ) >> 4
180180 opcode = byte & 0b0000_1111
181181
182- if ( 0x3 .. 0x7 ) . include? ( opcode )
182+ if opcode >= 0x3 && opcode <= 0x7
183183 raise ProtocolError , "Non-control opcode = #{ opcode } is reserved!"
184- elsif ( 0xB .. 0xF ) . include? ( opcode )
184+ elsif opcode >= 0xB
185185 raise ProtocolError , "Control opcode = #{ opcode } is reserved!"
186186 end
187187
@@ -197,12 +197,14 @@ def self.parse_header(buffer)
197197 # @returns [Frame] The fully read and populated frame.
198198 # @raises [ProtocolError] If the frame violates protocol constraints.
199199 # @raises [EOFError] If the stream ends unexpectedly.
200- def self . read ( finished , flags , opcode , stream , maximum_frame_size )
201- buffer = stream . read ( 1 ) or raise EOFError , "Could not read header!"
202- byte = buffer . unpack ( "C" ) . first
200+ def self . read ( finished , flags , opcode , stream , maximum_frame_size , second_byte = nil )
201+ unless second_byte
202+ buffer = stream . read ( 1 ) or raise EOFError , "Could not read header!"
203+ second_byte = buffer . getbyte ( 0 )
204+ end
203205
204- mask = ( byte & 0b1000_0000 != 0 )
205- length = byte & 0b0111_1111
206+ mask = ( second_byte & 0b1000_0000 != 0 )
207+ length = second_byte & 0b0111_1111
206208
207209 if opcode & 0x8 != 0
208210 if length > 125
@@ -213,21 +215,31 @@ def self.read(finished, flags, opcode, stream, maximum_frame_size)
213215 end
214216
215217 if length == 126
216- buffer = stream . read ( 2 ) or raise EOFError , "Could not read length!"
217- length = buffer . unpack ( "n" ) . first
218+ if mask
219+ buffer = stream . read ( 6 ) or raise EOFError , "Could not read length and mask!"
220+ length = buffer . unpack1 ( "n" )
221+ mask = buffer . byteslice ( 2 , 4 )
222+ else
223+ buffer = stream . read ( 2 ) or raise EOFError , "Could not read length!"
224+ length = buffer . unpack1 ( "n" )
225+ end
218226 elsif length == 127
219- buffer = stream . read ( 8 ) or raise EOFError , "Could not read length!"
220- length = buffer . unpack ( "Q>" ) . first
227+ if mask
228+ buffer = stream . read ( 12 ) or raise EOFError , "Could not read length and mask!"
229+ length = buffer . unpack1 ( "Q>" )
230+ mask = buffer . byteslice ( 8 , 4 )
231+ else
232+ buffer = stream . read ( 8 ) or raise EOFError , "Could not read length!"
233+ length = buffer . unpack1 ( "Q>" )
234+ end
235+ elsif mask
236+ mask = stream . read ( 4 ) or raise EOFError , "Could not read mask!"
221237 end
222238
223239 if length > maximum_frame_size
224240 raise ProtocolError , "Invalid payload length: #{ length } > #{ maximum_frame_size } !"
225241 end
226242
227- if mask
228- mask = stream . read ( 4 ) or raise EOFError , "Could not read mask!"
229- end
230-
231243 payload = stream . read ( length ) or raise EOFError , "Could not read payload!"
232244
233245 if payload . bytesize != length
0 commit comments