class WebSocket::Handshake::Handler::Server76

Public Instance Methods

valid?() click to toggle source

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

# File lib/websocket/handshake/handler/server76.rb, line 9
def valid?
  super && !!finishing_line
end

Private Instance Methods

challenge_response() click to toggle source

Response to client challenge from request Sec-WebSocket-Key1, Sec-WebSocket-Key2 and leftovers @return [String] Challenge response or nil if error occured

# File lib/websocket/handshake/handler/server76.rb, line 44
def challenge_response
  # Refer to 5.2 4-9 of the draft 76
  first = numbers_over_spaces(@handshake.headers['sec-websocket-key1'].to_s)
  second = numbers_over_spaces(@handshake.headers['sec-websocket-key2'].to_s)
  third = @handshake.leftovers

  sum = [first].pack('N*') +
        [second].pack('N*') +
        third
  Digest::MD5.digest(sum)
end
finishing_line() click to toggle source

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

# File lib/websocket/handshake/handler/server76.rb, line 36
def finishing_line
  @finishing_line ||= challenge_response
end
handshake_keys() click to toggle source

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

# File lib/websocket/handshake/handler/server76.rb, line 26
def handshake_keys
  [
    ['Upgrade', 'WebSocket'],
    ['Connection', 'Upgrade'],
    ['Sec-WebSocket-Origin', @handshake.headers['origin']],
    ['Sec-WebSocket-Location', @handshake.uri]
  ]
end
header_line() click to toggle source

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

# File lib/websocket/handshake/handler/server76.rb, line 21
def header_line
  'HTTP/1.1 101 WebSocket Protocol Handshake'
end
numbers_over_spaces(string) click to toggle source

Calculate numbers over spaces, according to spec 5.2 @param [String] string Key to parse @return [Integer] Result of calculations or nil if error occured

# File lib/websocket/handshake/handler/server76.rb, line 59
def numbers_over_spaces(string)
  numbers = string.scan(/[0-9]/).join.to_i

  spaces = string.scan(/ /).size
  # As per 5.2.5, abort the connection if spaces are zero.
  raise WebSocket::Error::Handshake::InvalidAuthentication if spaces == 0

  # As per 5.2.6, abort if numbers is not an integral multiple of spaces
  raise WebSocket::Error::Handshake::InvalidAuthentication if numbers % spaces != 0

  quotient = numbers / spaces

  raise WebSocket::Error::Handshake::InvalidAuthentication if quotient > 2**32 - 1

  return quotient
end
reserved_leftover_lines() click to toggle source

@see WebSocket::Handshake::Base#reserved_leftover_lines

# File lib/websocket/handshake/handler/server76.rb, line 16
def reserved_leftover_lines
  1
end