class WebSocket::Driver

Constants

MAX_LENGTH
STATES
UTF8_MATCH

www.w3.org/International/questions/qa-forms-utf-8.en.php

Attributes

protocol[R]
ready_state[R]

Public Class Methods

new(socket, options = {}) click to toggle source
Calls superclass method WebSocket::Driver::EventEmitter.new
# File lib/websocket/driver.rb, line 59
def initialize(socket, options = {})
  super()

  @socket      = socket
  @options     = options
  @max_length  = options[:max_length] || MAX_LENGTH
  @headers     = Headers.new
  @queue       = []
  @ready_state = 0
end

Private Class Methods

client(socket, options = {}) click to toggle source
# File lib/websocket/driver.rb, line 121
def self.client(socket, options = {})
  Client.new(socket, options.merge(:masking => true))
end
encode(string, encoding = nil) click to toggle source
# File lib/websocket/driver.rb, line 140
def self.encode(string, encoding = nil)
  if Array === string
    string = string.pack('C*')
    encoding ||= :binary
  else
    encoding ||= :utf8
  end
  case encoding
  when :binary
    string.force_encoding('ASCII-8BIT') if string.respond_to?(:force_encoding)
  when :utf8
    string.force_encoding('UTF-8') if string.respond_to?(:force_encoding)
    return nil unless valid_utf8?(string)
  end
  string
end
rack(socket, options = {}) click to toggle source
# File lib/websocket/driver.rb, line 129
def self.rack(socket, options = {})
  env = socket.env
  if env['HTTP_SEC_WEBSOCKET_VERSION']
    Hybi.new(socket, options.merge(:require_masking => true))
  elsif env['HTTP_SEC_WEBSOCKET_KEY1']
    Draft76.new(socket, options)
  else
    Draft75.new(socket, options)
  end
end
server(socket, options = {}) click to toggle source
# File lib/websocket/driver.rb, line 125
def self.server(socket, options = {})
  Server.new(socket, options.merge(:require_masking => true))
end
utf8_string(string) click to toggle source
# File lib/websocket/driver.rb, line 157
def self.utf8_string(string)
  string = string.pack('C*') if Array === string
  string.respond_to?(:force_encoding) ?
      string.force_encoding('UTF-8') :
      string
end
valid_utf8?(string) click to toggle source
# File lib/websocket/driver.rb, line 164
def self.valid_utf8?(string)
  if defined?(UTF8_MATCH)
    UTF8_MATCH =~ string ? true : false
  else
    string.valid_encoding?
  end
end
websocket?(env) click to toggle source
# File lib/websocket/driver.rb, line 172
def self.websocket?(env)
  connection = env['HTTP_CONNECTION'] || ''
  upgrade    = env['HTTP_UPGRADE']    || ''

  env['REQUEST_METHOD'] == 'GET' and
  connection.downcase.split(/\s*,\s*/).include?('upgrade') and
  upgrade.downcase == 'websocket'
end

Public Instance Methods

binary(message) click to toggle source
# File lib/websocket/driver.rb, line 92
def binary(message)
  false
end
close(reason = nil, code = nil) click to toggle source
# File lib/websocket/driver.rb, line 100
def close(reason = nil, code = nil)
  return false unless @ready_state == 1
  @ready_state = 3
  emit(:close, CloseEvent.new(nil, nil))
  true
end
ping(*args) click to toggle source
# File lib/websocket/driver.rb, line 96
def ping(*args)
  false
end
set_header(name, value) click to toggle source
# File lib/websocket/driver.rb, line 75
def set_header(name, value)
  return false unless @ready_state <= 0
  @headers[name] = value
  true
end
start() click to toggle source
# File lib/websocket/driver.rb, line 81
def start
  return false unless @ready_state == 0
  @socket.write(Driver.encode(handshake_response, :binary))
  open unless @stage == -1
  true
end
state() click to toggle source
# File lib/websocket/driver.rb, line 70
def state
  return nil unless @ready_state >= 0
  STATES[@ready_state]
end
text(message) click to toggle source
# File lib/websocket/driver.rb, line 88
def text(message)
  frame(message)
end

Private Instance Methods

open() click to toggle source
# File lib/websocket/driver.rb, line 109
def open
  @ready_state = 1
  @queue.each { |message| frame(*message) }
  @queue = []
  emit(:open, OpenEvent.new)
end
queue(message) click to toggle source
# File lib/websocket/driver.rb, line 116
def queue(message)
  @queue << message
  true
end