class LibWebSocket::Message

A base class for LibWebSocket::Request and LibWebSocket::Response.

Attributes

challenge[RW]
checksum[RW]
error[RW]
fields[RW]
host[RW]
number1[RW]
number2[RW]
origin[RW]
subprotocol[RW]
version[RW]

Public Class Methods

new(hash = {}) click to toggle source

A new instance of Message. Instance variables will be set from hash. @example

msg = LibMessage.new( :host => 'example.org' )
msg.host # => 'example.org'
# File lib/libwebsocket/message.rb, line 15
def initialize(hash = {})
  hash.each do |k,v|
    instance_variable_set("@#{k}",v)
  end

  @version ||= 76
  @buffer = ''
  @fields ||= {}
  @max_message_size ||= 2048
  @cookies ||= []
  @state = 'first_line'
end

Public Instance Methods

error=(val) click to toggle source

Set state to ‘error’ and write error message

# File lib/libwebsocket/message.rb, line 41
def error=(val)
  @error = val
  self.state = 'error'
end
field(f, val = nil) click to toggle source

Alias for fields. Use this instead of fields directly to preserve normalization(lowercase etc.)

# File lib/libwebsocket/message.rb, line 30
def field(f, val = nil)
  name = f.downcase

  return self.fields[name] unless val

  self.fields[name] = val

  return self
end
parse(string) click to toggle source

Parse string @see LibWebSocket::Request#parse @see LibWebSocket::Response#parse

# File lib/libwebsocket/message.rb, line 66
def parse(string)
  return unless string.is_a?(String)

  return if self.error

  return unless self.append(string)

  while(!self.state?('body') && line = self.get_line)
    if self.state?('first_line')
      return unless self.parse_first_line(line)

      self.state = 'fields'
    elsif line != ''
      return unless self.parse_field(line)
    else
      self.state = 'body'
      break
    end
  end

  return true unless self.state?('body')

  rv = self.parse_body
  return unless rv

  # Need more data
  return rv unless rv != true

  return self.done
end

Protected Instance Methods

append(data) click to toggle source
# File lib/libwebsocket/message.rb, line 126
def append(data)
  return if self.error

  @buffer += data

  if @buffer.length > @max_message_size
    self.error = 'Message is too long'
    return
  end

  return self
end
extract_number(key) click to toggle source
# File lib/libwebsocket/message.rb, line 109
def extract_number(key)
  number = ''
  while key.slice!(%r(\d)/)
    number += $1
  end
  number = number.to_i

  spaces = 0
  while key.slice!(%r /)
    spaces += 1
  end

  return if spaces == 0

  return (number / spaces).to_i
end
get_line() click to toggle source
# File lib/libwebsocket/message.rb, line 139
def get_line
  if @buffer.slice!(%r\A(.*?)\x0d?\x0a/)
    return $1
  end
  return
end
number(name, key, value = nil) click to toggle source
# File lib/libwebsocket/message.rb, line 99
def number(name, key, value = nil)
  if value
    return self.instance_variable_set("@#{name}", value)
  end

  return self.instance_variable_get("@#{name}") if self.instance_variable_get("@#{name}")

  return self.instance_variable_set("@#{name}", self.extract_number(self.send(key)))
end
parse_body() click to toggle source
# File lib/libwebsocket/message.rb, line 162
def parse_body
  self
end
parse_field(line) click to toggle source
# File lib/libwebsocket/message.rb, line 150
def parse_field(line)
  name, value = line.split(': ', 2)
  unless name && value
    self.error = 'Invalid field'
    return
  end

  self.field(name, value)

  return self
end
parse_first_line(line) click to toggle source
# File lib/libwebsocket/message.rb, line 146
def parse_first_line(line)
  self
end