Sha256: 619f39b6caacdbd4f95b920a816c3f9e930075a07e7b15e034f66759a4e80d19

Contents?: true

Size: 1.75 KB

Versions: 2

Compression:

Stored size: 1.75 KB

Contents

module WebSocket
  class Driver

    class Server < Driver
      EVENTS = %w[open message error close]

      def initialize(socket, options = {})
        super
        @http = HTTP::Request.new
      end

      def env
        @http.complete? ? @http.env : nil
      end

      def url
        return nil unless e = env

        url  = "ws://#{e['HTTP_HOST']}"
        url << e['PATH_INFO']
        url << "?#{e['QUERY_STRING']}" unless e['QUERY_STRING'] == ''
        url
      end

      %w[set_header start state frame text binary ping close].each do |method|
        define_method(method) do |*args|
          if @delegate
            @delegate.__send__(method, *args)
          else
            @queue << [method, args]
            true
          end
        end
      end

      %w[protocol version].each do |method|
        define_method(method) do
          @delegate && @delegate.__send__(method)
        end
      end

      def parse(buffer)
        return @delegate.parse(buffer) if @delegate

        @http.parse(buffer)
        return fail_request('Invalid HTTP request') if @http.error?
        return unless @http.complete?

        @delegate = Driver.rack(self, @options)
        @delegate.on(:open) { open }
        EVENTS.each do |event|
          @delegate.on(event) { |e| emit(event, e) }
        end

        emit(:connect, ConnectEvent.new)
      end

      def write(data)
        @socket.write(Driver.encode(data, :binary))
      end

    private

      def fail_request
        emit(:error, ProtocolError.new(message))
        emit(:close, CloseEvent.new(Hybi::ERRORS[:protocol_error], message))
      end

      def open
        @queue.each do |message|
          @delegate.__send__(message[0], *message[1])
        end
        @queue = []
      end
    end

  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
websocket-driver-0.3.4-java lib/websocket/driver/server.rb
websocket-driver-0.3.4 lib/websocket/driver/server.rb