class WebSocketRb::Protocol::Handshake

Constants

MAGIC_KEY

Public Class Methods

new(conn) click to toggle source
# File lib/web_socket_rb/protocol/handshake.rb, line 10
def initialize(conn)
  @conn = conn
end

Public Instance Methods

run() click to toggle source

Generate a proper handshake response based on request

# File lib/web_socket_rb/protocol/handshake.rb, line 15
def run
  validate_request
  generate_proper_response
  @conn
end

Private Instance Methods

calculate_key(key) click to toggle source

Calculate handshake key

# File lib/web_socket_rb/protocol/handshake.rb, line 52
def calculate_key(key)
  raise ArgumentError, 'Key must be a String' unless key.is_a?(String)
  ::Digest::SHA1.base64digest(key.strip + MAGIC_KEY)
end
generate_proper_response() click to toggle source

Generate a proper response based on request

# File lib/web_socket_rb/protocol/handshake.rb, line 41
def generate_proper_response
  App.logger.info('Handshake') { 'Send accept response' }
  @conn.puts('HTTP/1.1 101 Switching Protocols')
  @conn.puts('Upgrade: websocket')
  @conn.puts('Connection: Upgrade')
  @conn.puts("Sec-WebSocket-Accept: #{calculate_key(request.key)}")
  @conn.puts('')
  App.logger.info('Handshake') { 'Finished sending accept response' }
end
request() click to toggle source

Read incoming data from socket and convert it to handshake request

# File lib/web_socket_rb/protocol/handshake.rb, line 24
def request
  @request ||= Wrapper::HandshakeRequest.new(@conn)
end
validate_request() click to toggle source

Validate incoming request - is it a WebSocket upgrade request?

# File lib/web_socket_rb/protocol/handshake.rb, line 29
def validate_request
  App.logger.info('Handshake') { 'Verification started' }
  raise Error::HandshakeError, 'It is not an upgrade request' unless request.upgrade?
  App.logger.info('Handshake') { 'Valid upgrade request' }
  raise Error::HandshakeError, 'Not valid protocol version.' unless request.valid_version?
  App.logger.info('Handshake') { 'Valid protocol version' }
  raise Error::HandshakeError, 'Not valid sub-protocol. Only JSON available.' unless request.valid_protocol?
  App.logger.info('Handshake') { 'Valid sub-protocol request' }
  App.logger.info('Handshake') { 'Verification passed' }
end