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