class Faye::WebSocket
def self.determine_url(env)
def self.determine_url(env) secure = if env.has_key?('HTTP_X_FORWARDED_PROTO') env['HTTP_X_FORWARDED_PROTO'] == 'https' else env['HTTP_ORIGIN'] =~ /^https:/i end scheme = secure ? 'wss:' : 'ws:' "#{ scheme }//#{ env['HTTP_HOST'] }#{ env['REQUEST_URI'] }" end
def self.encode(string, validate_encoding = false)
def self.encode(string, validate_encoding = false) if Array === string string = utf8_string(string) return nil if validate_encoding and !valid_utf8?(string) end utf8_string(string) end
def self.jruby?
def self.jruby? defined?(RUBY_ENGINE) && RUBY_ENGINE == 'jruby' end
def self.load_adapter(backend)
def self.load_adapter(backend) const = Kernel.const_get(ADAPTERS[backend]) rescue nil require(backend) unless const require File.expand_path("../adapters/#{backend}", __FILE__) end
def self.parser(env)
def self.parser(env) if env['HTTP_SEC_WEBSOCKET_VERSION'] HybiParser elsif env['HTTP_SEC_WEBSOCKET_KEY1'] Draft76Parser else Draft75Parser end end
def self.rbx?
def self.rbx? defined?(RUBY_ENGINE) && RUBY_ENGINE == 'rbx' end
def self.utf8_string(string)
def self.utf8_string(string) string = string.pack('C*') if Array === string string.respond_to?(:force_encoding) ? string.force_encoding('UTF-8') : string end
def self.valid_utf8?(byte_array)
def self.valid_utf8?(byte_array) string = utf8_string(byte_array) if defined?(UTF8_MATCH) UTF8_MATCH =~ string ? true : false else string.valid_encoding? end end
def self.websocket?(env)
def self.websocket?(env) env['REQUEST_METHOD'] == 'GET' and env['HTTP_CONNECTION'] and env['HTTP_CONNECTION'].split(/\s*,\s*/).include?('Upgrade') and env['HTTP_UPGRADE'].downcase == 'websocket' end
def initialize(env, supported_protos = nil, options = {})
def initialize(env, supported_protos = nil, options = {}) @env = env @stream = Stream.new(self) @ping = options[:ping] @ping_id = 0 @url = WebSocket.determine_url(@env) @ready_state = CONNECTING @buffered_amount = 0 @parser = WebSocket.parser(@env).new(self, :protocols => supported_protos) @send_buffer = [] EventMachine.next_tick { open } @callback = @env['async.callback'] @callback.call([101, {}, @stream]) @stream.write(@parser.handshake_response) @ready_state = OPEN if @parser.open? if @ping @ping_timer = EventMachine.add_periodic_timer(@ping) do @ping_id += 1 ping(@ping_id.to_s) end end end
def parse(data)
def parse(data) response = @parser.parse(data) return unless response @stream.write(response) open end
def ping(message = '', &callback)
def ping(message = '', &callback) return false unless @parser.respond_to?(:ping) @parser.ping(message, &callback) end
def protocol
def protocol @parser.protocol || '' end
def rack_response
def rack_response [ -1, {}, [] ] end