class WebSocket::Frame::Handler::Handler07

def close_code?(frame)

def close_code?(frame)
  frame && frame.type == :close && !frame.data.empty?
end

def decode_frame

def decode_frame
  result = super
  if close_code?(result)
    code = result.data.slice!(0..1)
    result.code = code.unpack('n').first
    raise WebSocket::Error::Frame::UnknownCloseCode unless valid_code?(result.code)
    raise WebSocket::Error::Frame::InvalidPayloadEncoding unless valid_encoding?(result.data)
  end
  result
end

def encode_frame

def encode_frame
  if @frame.type == :close
    code = @frame.code || 1000
    raise WebSocket::Error::Frame::UnknownCloseCode unless valid_code?(code)
    @frame.data = Data.new([code].pack('n') + @frame.data.to_s)
    @frame.code = nil
  end
  super
end

def opcode_to_type(opcode)

Raises:
  • (WebSocket::Error) - if frame type name is not known

Returns:
  • (Symbol) - Frame type name or nil

Parameters:
  • opcode (Integer) -- Opcode
def opcode_to_type(opcode)
  FRAME_TYPES_INVERSE[opcode] || raise(WebSocket::Error::Frame::UnknownOpcode)
end

def type_to_opcode(frame_type)

Raises:
  • (WebSocket::Error) - if frame opcode is not known

Returns:
  • (Integer) - opcode or nil

Parameters:
  • frame_type (Symbol) -- Frame type name
def type_to_opcode(frame_type)
  FRAME_TYPES[frame_type] || raise(WebSocket::Error::Frame::UnknownFrameType)
end

def valid_code?(code)

def valid_code?(code)
  [1000, 1001, 1002, 1003, 1007, 1008, 1009, 1010, 1011].include?(code) || (3000..4999).cover?(code)
end

def valid_encoding?(data)

def valid_encoding?(data)
  return true if data.nil?
  data.encode('UTF-8')
  true
rescue StandardError
  false
end