class Faye::WebSocket
def self.encode(string, validate_encoding = false)
def self.encode(string, validate_encoding = false) if Array === string return nil if validate_encoding and !valid_utf8?(string) string = string.pack('C*') end return string unless string.respond_to?(:force_encoding) string.force_encoding('UTF-8') end
def self.parser(env)
def self.parser(env) if env['HTTP_SEC_WEBSOCKET_VERSION'] Protocol8Parser elsif env['HTTP_SEC_WEBSOCKET_KEY1'] Draft76Parser else Draft75Parser end end
def self.valid_utf8?(byte_array)
def self.valid_utf8?(byte_array) UTF8_MATCH =~ byte_array.pack('C*') ? true : false end
def determine_url
def determine_url 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 initialize(env)
def initialize(env) @env = env @callback = @env['async.callback'] @stream = Stream.new(self, @env['em.connection']) @callback.call [200, {}, @stream] @url = determine_url @ready_state = CONNECTING @buffered_amount = 0 @parser = WebSocket.parser(@env).new(self) @stream.write(@parser.handshake_response) @ready_state = OPEN event = Event.new('open') event.init_event('open', false, false) dispatch_event(event) @env[Thin::Request::WEBSOCKET_RECEIVE_CALLBACK] = lambda do |data| response = @parser.parse(data) @stream.write(response) if response end end