@@ -147,27 +147,29 @@ def apply(connection)
147147 end
148148
149149 def self . parse_header ( buffer )
150- byte = buffer . unpack ( "C" ) . first
150+ byte = buffer . getbyte ( 0 )
151151
152152 finished = ( byte & 0b1000_0000 != 0 )
153153 flags = ( byte & 0b0111_0000 ) >> 4
154154 opcode = byte & 0b0000_1111
155155
156- if ( 0x3 .. 0x7 ) . include? ( opcode )
156+ if opcode >= 0x3 && opcode <= 0x7
157157 raise ProtocolError , "Non-control opcode = #{ opcode } is reserved!"
158- elsif ( 0xB .. 0xF ) . include? ( opcode )
158+ elsif opcode >= 0xB
159159 raise ProtocolError , "Control opcode = #{ opcode } is reserved!"
160160 end
161161
162162 return finished , flags , opcode
163163 end
164164
165- def self . read ( finished , flags , opcode , stream , maximum_frame_size )
166- buffer = stream . read ( 1 ) or raise EOFError , "Could not read header!"
167- byte = buffer . unpack ( "C" ) . first
165+ def self . read ( finished , flags , opcode , stream , maximum_frame_size , second_byte = nil )
166+ unless second_byte
167+ buffer = stream . read ( 1 ) or raise EOFError , "Could not read header!"
168+ second_byte = buffer . getbyte ( 0 )
169+ end
168170
169- mask = ( byte & 0b1000_0000 != 0 )
170- length = byte & 0b0111_1111
171+ mask = ( second_byte & 0b1000_0000 != 0 )
172+ length = second_byte & 0b0111_1111
171173
172174 if opcode & 0x8 != 0
173175 if length > 125
@@ -178,21 +180,31 @@ def self.read(finished, flags, opcode, stream, maximum_frame_size)
178180 end
179181
180182 if length == 126
181- buffer = stream . read ( 2 ) or raise EOFError , "Could not read length!"
182- length = buffer . unpack ( "n" ) . first
183+ if mask
184+ buffer = stream . read ( 6 ) or raise EOFError , "Could not read length and mask!"
185+ length = buffer . unpack1 ( "n" )
186+ mask = buffer . byteslice ( 2 , 4 )
187+ else
188+ buffer = stream . read ( 2 ) or raise EOFError , "Could not read length!"
189+ length = buffer . unpack1 ( "n" )
190+ end
183191 elsif length == 127
184- buffer = stream . read ( 8 ) or raise EOFError , "Could not read length!"
185- length = buffer . unpack ( "Q>" ) . first
192+ if mask
193+ buffer = stream . read ( 12 ) or raise EOFError , "Could not read length and mask!"
194+ length = buffer . unpack1 ( "Q>" )
195+ mask = buffer . byteslice ( 8 , 4 )
196+ else
197+ buffer = stream . read ( 8 ) or raise EOFError , "Could not read length!"
198+ length = buffer . unpack1 ( "Q>" )
199+ end
200+ elsif mask
201+ mask = stream . read ( 4 ) or raise EOFError , "Could not read mask!"
186202 end
187203
188204 if length > maximum_frame_size
189205 raise ProtocolError , "Invalid payload length: #{ length } > #{ maximum_frame_size } !"
190206 end
191207
192- if mask
193- mask = stream . read ( 4 ) or raise EOFError , "Could not read mask!"
194- end
195-
196208 payload = stream . read ( length ) or raise EOFError , "Could not read payload!"
197209
198210 if payload . bytesize != length
0 commit comments