1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
|
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(Driver.encode(headers.join("\r\n"), :binary))
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
|