Sha256: fc40259ebd709b69c3c9cb8c92154223dc4ee7d4ee63ca01ae7f78877a50016d

Contents?: true

Size: 1.69 KB

Versions: 13

Compression:

Stored size: 1.69 KB

Contents

module WebSocket
  class Driver

    class Proxy
      include EventEmitter

      PORTS = { 'ws' => 80, 'wss' => 443 }

      attr_reader :status, :headers

      def initialize(client, origin, options)
        super()

        @client  = client
        @http    = HTTP::Response.new
        @socket  = client.instance_variable_get(:@socket)
        @origin  = URI.parse(@socket.url)
        @url     = URI.parse(origin)
        @options = options
        @state   = 0

        @headers = Headers.new
        @headers['Host'] = @origin.host + (@origin.port ? ":#{ @origin.port }" : '')
        @headers['Connection'] = 'keep-alive'
        @headers['Proxy-Connection'] = 'keep-alive'

        if @url.user
          auth = Base64.strict_encode64([@url.user, @url.password] * ':')
          @headers['Proxy-Authorization'] = 'Basic ' + auth
        end
      end

      def set_header(name, value)
        return false unless @state == 0
        @headers[name] = value
        true
      end

      def start
        return false unless @state == 0
        @state = 1

        port    = @origin.port || PORTS[@origin.scheme]
        start   = "CONNECT #{ @origin.host }:#{ port } HTTP/1.1"
        headers = [start, @headers.to_s, '']

        @socket.write(headers.join("\r\n"))
        true
      end

      def parse(chunk)
        @http.parse(chunk)
        return unless @http.complete?

        @status  = @http.code
        @headers = Headers.new(@http.headers)

        if @status == 200
          emit(:connect, ConnectEvent.new)
        else
          message = "Can't establish a connection to the server at #{ @socket.url }"
          emit(:error, ProtocolError.new(message))
        end
      end
    end

  end
end

Version data entries

13 entries across 13 versions & 4 rubygems

Version Path
scrapbook-0.3.2 vendor/ruby/2.7.0/gems/websocket-driver-0.7.5/lib/websocket/driver/proxy.rb
scrapbook-0.3.1 vendor/ruby/2.7.0/gems/websocket-driver-0.7.5/lib/websocket/driver/proxy.rb
date_n_time_picker_activeadmin-0.1.2 vendor/bundle/ruby/2.6.0/gems/websocket-driver-0.7.5/lib/websocket/driver/proxy.rb
date_n_time_picker_activeadmin-0.1.1 vendor/bundle/ruby/2.6.0/gems/websocket-driver-0.7.5/lib/websocket/driver/proxy.rb
rails_mini_profiler-0.2.0 vendor/bundle/ruby/3.0.0/gems/websocket-driver-0.7.5/lib/websocket/driver/proxy.rb
websocket-driver-0.7.5-java lib/websocket/driver/proxy.rb
websocket-driver-0.7.5 lib/websocket/driver/proxy.rb
websocket-driver-0.7.4-java lib/websocket/driver/proxy.rb
websocket-driver-0.7.4 lib/websocket/driver/proxy.rb
websocket-driver-0.7.3-java lib/websocket/driver/proxy.rb
websocket-driver-0.7.3 lib/websocket/driver/proxy.rb
websocket-driver-0.7.2-java lib/websocket/driver/proxy.rb
websocket-driver-0.7.2 lib/websocket/driver/proxy.rb