def decode_frame
return if @frame.data.size.zero?
pointer = 0
frame_type = @frame.data.getbyte(pointer)
pointer += 1
if (frame_type & 0x80) == 0x80
length = 0
loop do
return unless @frame.data.getbyte(pointer)
b = @frame.data.getbyte(pointer)
pointer += 1
b_v = b & 0x7F
length = length * 128 + b_v
break unless (b & 0x80) == 0x80
end
raise WebSocket::Error::Frame::TooLong if length > ::WebSocket.max_frame_size
unless @frame.data.getbyte(pointer + length - 1).nil?
@frame.instance_variable_set '@data', @frame.data[(pointer + length)..-1]
if length.zero?
@frame.class.new(version: @frame.version, type: :close, decoded: true)
end
end
else
raise WebSocket::Error::Frame::Invalid if @frame.data.getbyte(0) != 0x00
raise WebSocket::Error::Frame::TooLong if @frame.data.size > ::WebSocket.max_frame_size
msg = @frame.data.slice!(/\A\x00[^\xff]*\xff/)
if msg
msg.gsub!(/\A\x00|\xff\z/, '')
msg.force_encoding('UTF-8')
@frame.class.new(version: @frame.version, type: :text, data: msg, decoded: true)
end
end
end