Class: Faye::WebSocket::Protocol8Parser::Handshake

Inherits:
Object
  • Object
show all
Defined in:
lib/faye/util/web_socket/protocol8_parser.rb

Instance Method Summary collapse

Constructor Details

#initialize(uri) ⇒ Handshake

Returns a new instance of Handshake.



37
38
39
40
41
42
# File 'lib/faye/util/web_socket/protocol8_parser.rb', line 37

def initialize(uri)
  @uri    = uri
  @key    = Base64.encode64((1..16).map { rand(255).chr } * '').strip
  @accept = Base64.encode64(Digest::SHA1.digest(@key + GUID)).strip
  @buffer = []
end

Instance Method Details

#complete?Boolean

Returns:

  • (Boolean)


62
63
64
# File 'lib/faye/util/web_socket/protocol8_parser.rb', line 62

def complete?
  @buffer[-4..-1] == ["\r", "\n", "\r", "\n"]
end

#parse(data) ⇒ Object



58
59
60
# File 'lib/faye/util/web_socket/protocol8_parser.rb', line 58

def parse(data)
  data.each_byte { |b| @buffer << b.chr }
end

#request_dataObject



44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/faye/util/web_socket/protocol8_parser.rb', line 44

def request_data
  hostname = @uri.host + (@uri.port ? ":#{@uri.port}" : '')
  
  handshake  = "GET #{@uri.path} HTTP/1.1\r\n"
  handshake << "Host: #{hostname}\r\n"
  handshake << "Upgrade: websocket\r\n"
  handshake << "Connection: Upgrade\r\n"
  handshake << "Sec-WebSocket-Key: #{@key}\r\n"
  handshake << "Sec-WebSocket-Version: 8\r\n"
  handshake << "\r\n"
  
  handshake
end

#valid?Boolean

Returns:

  • (Boolean)


66
67
68
69
70
71
72
73
74
75
76
# File 'lib/faye/util/web_socket/protocol8_parser.rb', line 66

def valid?
  data = Faye.encode(@buffer * '')
  response = Net::HTTPResponse.read_new(Net::BufferedIO.new(StringIO.new(data)))
  return false unless response.code.to_i == 101
  
  upgrade, connection = response['Upgrade'], response['Connection']
  
  upgrade and upgrade =~ /^websocket$/i and
  connection and connection.split(/\s*,\s*/).include?('Upgrade') and
  response['Sec-WebSocket-Accept'] == @accept
end