Method: WebSocket#initialize
- Defined in:
- lib/web/web-socket-ruby/lib/web_socket.rb
#initialize(arg, params = {}) ⇒ WebSocket
Returns a new instance of WebSocket.
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 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 |
# File 'lib/web/web-socket-ruby/lib/web_socket.rb', line 37 def initialize(arg, params = {}) if params[:server] # server @server = params[:server] @socket = arg line = gets() if !line raise(WebSocket::Error, "Client disconnected without sending anything.") end line = line.chomp() if !(line =~ /\AGET (\S+) HTTP\/1.1\z/n) raise(WebSocket::Error, "Invalid request: #{line}") end @path = $1 read_header() if @header["sec-websocket-version"] @web_socket_version = @header["sec-websocket-version"] @key3 = nil elsif @header["sec-websocket-key1"] && @header["sec-websocket-key2"] @web_socket_version = "hixie-76" @key3 = read(8) else @web_socket_version = "hixie-75" @key3 = nil end if !@server.accepted_origin?(self.origin) raise(WebSocket::Error, ("Unaccepted origin: %s (server.accepted_domains = %p)\n\n" + "To accept this origin, write e.g. \n" + " WebSocketServer.new(..., :accepted_domains => [%p]), or\n" + " WebSocketServer.new(..., :accepted_domains => [\"*\"])\n") % [self.origin, @server.accepted_domains, @server.origin_to_domain(self.origin)]) end @handshaked = false else # client @web_socket_version = "hixie-76" uri = arg.is_a?(String) ? URI.parse(arg) : arg if uri.scheme == "ws" default_port = 80 elsif uri.scheme = "wss" default_port = 443 else raise(WebSocket::Error, "unsupported scheme: #{uri.scheme}") end @path = (uri.path.empty? ? "/" : uri.path) + (uri.query ? "?" + uri.query : "") host = uri.host + ((!uri.port || uri.port == default_port) ? "" : ":#{uri.port}") origin = params[:origin] || "http://#{uri.host}" key1 = generate_key() key2 = generate_key() key3 = generate_key3() socket = TCPSocket.new(uri.host, uri.port || default_port) if uri.scheme == "ws" @socket = socket else @socket = ssl_handshake(socket) end write( "GET #{@path} HTTP/1.1\r\n" + "Upgrade: WebSocket\r\n" + "Connection: Upgrade\r\n" + "Host: #{host}\r\n" + "Origin: #{origin}\r\n" + "Sec-WebSocket-Key1: #{key1}\r\n" + "Sec-WebSocket-Key2: #{key2}\r\n" + "\r\n" + "#{key3}") flush() line = gets().chomp() raise(WebSocket::Error, "bad response: #{line}") if !(line =~ /\AHTTP\/1.1 101 /n) read_header() if (@header["sec-websocket-origin"] || "").downcase() != origin.downcase() raise(WebSocket::Error, "origin doesn't match: '#{@header["sec-websocket-origin"]}' != '#{origin}'") end reply_digest = read(16) expected_digest = hixie_76_security_digest(key1, key2, key3) if reply_digest != expected_digest raise(WebSocket::Error, "security digest doesn't match: %p != %p" % [reply_digest, expected_digest]) end @handshaked = true end @received = [] @buffer = "" @closing_started = false end |