class WebSocket::Handshake::Base

@abstract Subclass and override to implement custom handshakes

def <<(data)

Other tags:
    Abstract: - Add data to handshake
def <<(data)
  @data << data
end

def default_port

Return default port for protocol (80 for ws, 443 for wss)
def default_port
  secure ? 443 : 80
end

def default_port?

Check if provided port is a default one
def default_port?
  port == default_port
end

def error=(message)

Parameters:
  • message (String) -- Error message to set
def error=(message)
  @state = :error
  super
end

def finished?

Returns:
  • (Boolena) - True if request was completely parsed or error occured. False otherwise
def finished?
  @state == :finished || @state == :error
end

def initialize(args = {})

Initialize new WebSocket Handshake and set it's state to :new
def initialize(args = {})
  args.each do |k, v|
    value = begin
      v.dup
    rescue TypeError
      v
    end
    instance_variable_set("@#{k}", value)
  end
  @state = :new
  @handler = nil
  @data = String.new('')
  @headers ||= {}
  @protocols ||= []
end

def leftovers

Returns:
  • (String) - String if some data are available. Nil otherwise
def leftovers
  (@leftovers.to_s.split("\n", reserved_leftover_lines + 1)[reserved_leftover_lines] || '').strip
end

def parse_data

Returns:
  • (Boolean) - True if finished parsing. False if not all data received yet.
def parse_data
  header, @leftovers = @data.split("\r\n\r\n", 2)
  return false unless @leftovers # The whole header has not been received yet.
  lines = header.split("\r\n")
  first_line = lines.shift
  parse_first_line(first_line)
  lines.each do |line|
    h = HEADER.match(line)
    next unless h # Skip any invalid headers
    key = h[1].strip.downcase
    val = h[2].strip
    # If the header is already set and refers to the websocket protocol, append the new value
    if @headers.key?(key) && key =~ /^(sec-)?websocket-protocol$/
      @headers[key] << ", #{val}"
    else
      @headers[key] = val
    end
  end
  @state = :finished
  true
end

def port

def port
  @port || default_port
end

def reserved_leftover_lines

Returns:
  • (Integer) - Number of lines
def reserved_leftover_lines
  0
end

def should_respond?

Other tags:
    Abstract: - Should send data after parsing is finished?
def should_respond?
  raise NotImplementedError
end

def to_s

Returns:
  • (String) - text of response
def to_s
  @handler ? @handler.to_s : ''
end

def uri

Returns:
  • (String) - Full URI with protocol
def uri
  uri =  String.new(secure ? 'wss://' : 'ws://')
  uri << host
  uri << ":#{port}" unless default_port?
  uri << path
  uri << "?#{query}" if query
  uri
end

def valid?

Returns:
  • (Boolean) - False if some errors occured. Reason for error could be found in error method
def valid?
  finished? && @error.nil? && @handler && @handler.valid?
end