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 10
def valid?
  super && !finishing_line.nil?
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 41
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 35
def finishing_line
  @finishing_line ||= challenge_response
end
header_line() click to toggle source

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

# File lib/websocket/handshake/handler/server76.rb, line 30
def header_line
  'HTTP/1.1 101 WebSocket Protocol Handshake'
end
headers() click to toggle source
# File lib/websocket/handshake/handler/server76.rb, line 16
def headers
  {
    origin: 'Sec-WebSocket-Origin',
    location: 'Sec-WebSocket-Location',
    protocol: 'Sec-WebSocket-Protocol'
  }.freeze
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 56
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.zero?

  # 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

  quotient
end
reserved_leftover_lines() click to toggle source

@see WebSocket::Handshake::Base#reserved_leftover_lines

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