class WebSocketServer

Attributes

accepted_domains[R]
port[R]
tcp_server[R]

Public Class Methods

new(params_or_uri, params = nil) click to toggle source
# File lib/websocket.rb, line 440
def initialize(params_or_uri, params = nil)
  if params
    uri = params_or_uri.is_a?(String) ? URI.parse(params_or_uri) : params_or_uri
    params[:port] ||= uri.port
    params[:accepted_domains] ||= [uri.host]
  else
    params = params_or_uri
  end
  @port = params[:port] || 80
  @accepted_domains = params[:accepted_domains]
  if !@accepted_domains
    raise(ArgumentError, "params[:accepted_domains] is required")
  end
  if params[:host]
    @tcp_server = TCPServer.open(params[:host], @port)
  else
    @tcp_server = TCPServer.open(@port)
  end
end

Public Instance Methods

accept() click to toggle source
# File lib/websocket.rb, line 480
def accept()
  return @tcp_server.accept()
end
accepted_origin?(origin) click to toggle source
# File lib/websocket.rb, line 484
def accepted_origin?(origin)
  domain = origin_to_domain(origin)
  return @accepted_domains.any?(){ |d| File.fnmatch(d, domain) }
end
create_web_socket(socket) click to toggle source
# File lib/websocket.rb, line 497
def create_web_socket(socket)
  ch = socket.getc()
  if ch == ?<
    # This is Flash socket policy file request, not an actual Web Socket connection.
    send_flash_socket_policy_file(socket)
    return nil
  else
    socket.ungetc(ch)
    return WebSocket.new(socket, :server => self)
  end
end
origin_to_domain(origin) click to toggle source
# File lib/websocket.rb, line 489
def origin_to_domain(origin)
  if origin == "null" || origin == "file://"  # local file
    return "null"
  else
    return URI.parse(origin).host
  end
end
run() { |ws| ... } click to toggle source
# File lib/websocket.rb, line 462
def run(&block)
  while true
    Thread.start(accept()) do |s|
      begin
        ws = create_web_socket(s)
        yield(ws) if ws
      rescue => ex
        print_backtrace(ex)
      ensure
        begin
          ws.close_socket() if ws
        rescue
        end
      end
    end
  end
end

Private Instance Methods

print_backtrace(ex) click to toggle source
send_flash_socket_policy_file(socket) click to toggle source

Handles Flash socket policy file request sent when web-socket-js is used: github.com/gimite/web-socket-js/tree/master

# File lib/websocket.rb, line 520
def send_flash_socket_policy_file(socket)
  socket.puts('<?xml version="1.0"?>')
  socket.puts('<!DOCTYPE cross-domain-policy SYSTEM ' +
    '"http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">')
  socket.puts('<cross-domain-policy>')
  for domain in @accepted_domains
    next if domain == "file://"
    socket.puts("<allow-access-from domain=\"#{domain}\" to-ports=\"#{@port}\"/>")
  end
  socket.puts('</cross-domain-policy>')
  socket.close()
end