class Faye::WebSocket::Draft76Parser
def big_endian(number)
def big_endian(number) string = '' [24,16,8,0].each do |offset| string << (number >> offset & 0xFF).chr end string end
def close(code = nil, reason = nil, &callback)
def close(code = nil, reason = nil, &callback) return if @closed @socket.send([0xFF, 0x00]) if @closing @closed = true callback.call if callback end
def handshake_response
def handshake_response env = @socket.env signature = handshake_signature(env['rack.input'].read) upgrade = "HTTP/1.1 101 Web Socket Protocol Handshake\r\n" upgrade << "Upgrade: WebSocket\r\n" upgrade << "Connection: Upgrade\r\n" upgrade << "Sec-WebSocket-Origin: #{env['HTTP_ORIGIN']}\r\n" upgrade << "Sec-WebSocket-Location: #{@socket.url}\r\n" upgrade << "\r\n" upgrade << signature if signature upgrade end
def handshake_signature(head)
def handshake_signature(head) return nil if head.empty? env = @socket.env key1 = env['HTTP_SEC_WEBSOCKET_KEY1'] value1 = number_from_key(key1) / spaces_in_key(key1) key2 = env['HTTP_SEC_WEBSOCKET_KEY2'] value2 = number_from_key(key2) / spaces_in_key(key2) @handshake_complete = true Digest::MD5.digest(big_endian(value1) + big_endian(value2) + head) end
def number_from_key(key)
def number_from_key(key) key.scan(/[0-9]/).join('').to_i(10) end
def open?
def open? !!@handshake_complete end
def parse(data)
def parse(data) return super if @handshake_complete handshake_signature(data) end
def parse_leading_byte(data)
def parse_leading_byte(data) return super unless data == 0xFF @closing = true @length = 0 @stage = 1 end
def spaces_in_key(key)
def spaces_in_key(key) key.scan(/ /).size end
def version
def version 'hixie-76' end