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
# File lib/websocket.rb, line 511 def print_backtrace(ex) $stderr.printf("%s: %s (%p)\n", ex.backtrace[0], ex.message, ex.class) for s in ex.backtrace[1..-1] $stderr.printf(" %s\n", s) end end
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