class WebSocket::Handshake::Handler::Client76

Constants

NOISE_CHARS

Public Instance Methods

valid?() click to toggle source

@see WebSocket::Handshake::Base#valid?

# File lib/websocket/handshake/handler/client76.rb, line 10
def valid?
  super && verify_challenge && verify_protocol
end

Private Instance Methods

challenge() click to toggle source

Expected challenge that should be sent by server @return [String] challenge

# File lib/websocket/handshake/handler/client76.rb, line 54
def challenge
  return @challenge if defined?(@challenge)
  key1 && key2
  sum = [@key1_number].pack('N*') +
        [@key2_number].pack('N*') +
        key3

  @challenge = Digest::MD5.digest(sum).strip
end
finishing_line() click to toggle source

@see WebSocket::Handshake::Handler::Base#finishing_line

# File lib/websocket/handshake/handler/client76.rb, line 30
def finishing_line
  key3
end
generate_key(key) click to toggle source

Generate Sec-WebSocket-Key1 and Sec-WebSocket-Key2 @param key [String] name of key. Will be used to set number variable needed later. Valid values: key1, key2 @return [String] generated key

# File lib/websocket/handshake/handler/client76.rb, line 76
def generate_key(key)
  spaces = rand(1..12)
  max = 0xffffffff / spaces
  number = rand(max + 1)
  instance_variable_set("@#{key}_number", number)
  key = (number * spaces).to_s
  rand(1..12).times do
    char = NOISE_CHARS[rand(NOISE_CHARS.size)]
    pos = rand(key.size + 1)
    key[pos...pos] = char
  end
  spaces.times do
    pos = 1 + rand(key.size - 1)
    key[pos...pos] = ' '
  end
  key
end
generate_key3() click to toggle source

Generate third key

# File lib/websocket/handshake/handler/client76.rb, line 95
def generate_key3
  [rand(0x100000000)].pack('N') + [rand(0x100000000)].pack('N')
end
handshake_keys() click to toggle source

@see WebSocket::Handshake::Handler::Base#handshake_keys

# File lib/websocket/handshake/handler/client76.rb, line 22
def handshake_keys
  keys = super
  keys << ['Sec-WebSocket-Key1', key1]
  keys << ['Sec-WebSocket-Key2', key2]
  keys
end
key1() click to toggle source

Sec-WebSocket-Key1 value @return [String] key

# File lib/websocket/handshake/handler/client76.rb, line 36
def key1
  @key1 ||= generate_key(:key1)
end
key2() click to toggle source

Sec-WebSocket-Key2 value @return [String] key

# File lib/websocket/handshake/handler/client76.rb, line 42
def key2
  @key2 ||= generate_key(:key2)
end
key3() click to toggle source

Value of third key, sent in body @return [String] key

# File lib/websocket/handshake/handler/client76.rb, line 48
def key3
  @key3 ||= generate_key3
end
provided_protocols() click to toggle source
# File lib/websocket/handshake/handler/client76.rb, line 99
def provided_protocols
  Array(@handshake.headers['sec-websocket-protocol'].to_s.strip)
end
reserved_leftover_lines() click to toggle source

@see WebSocket::Handshake::Base#reserved_leftover_lines

# File lib/websocket/handshake/handler/client76.rb, line 17
def reserved_leftover_lines
  1
end
verify_challenge() click to toggle source

Verify if challenge sent by server match generated one @return [Boolena] True if challenge matches, false otherwise(sets appropriate error)

# File lib/websocket/handshake/handler/client76.rb, line 66
def verify_challenge
  raise WebSocket::Error::Handshake::InvalidAuthentication unless @handshake.leftovers == challenge
  true
end