Class: WebSocketClient::Ietf00

Inherits:
Object
  • Object
show all
Defined in:
lib/websocket_client/ietf_00.rb

Instance Method Summary collapse

Constructor Details

#initialize(uri, socket) ⇒ Ietf00

Returns a new instance of Ietf00.



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
# File 'lib/websocket_client/ietf_00.rb', line 9

def initialize(uri, socket)
  puts "initialize for #{socket}"
  @socket = socket
  key1, key2, key3, solution = generate_keys()

  puts "> sending prolog"
  @socket.puts "GET #{uri.path} HTTP/1.1"
  @socket.puts "Host: #{uri.host}"
  @socket.puts "Connection: upgrade"
  @socket.puts "Upgrade: websocket"
  @socket.puts "Origin: http://#{uri.host}/"
  @socket.puts "Sec-WebSocket-Version: 8"
  @socket.puts "Sec-WebSocket-Key1: #{key1}"
  @socket.puts "Sec-WebSocket-Key2: #{key2}"
  @socket.puts ""
  @socket.print key3
  @socket.puts ""
  @socket.flush
  
  while ( ! @socket.eof? ) 
    line = readline( socket )
    puts ">> #{line}"
    break if ( line.strip == '' ) 
  end

  challenge = readline( socket ).strip

  puts "> challenge-response #{challenge}"
  if ( challenge == solution )
    puts "success!"
  end
  #dump 'solution', solution
  #dump 'challenge', challenge
end

Instance Method Details

#encode_text_message(msg) ⇒ Object



63
64
65
66
67
68
# File 'lib/websocket_client/ietf_00.rb', line 63

def encode_text_message(msg)
  @socket.putc 0x00
  @socket.print msg
  @socket.putc 0xFF
  @socket.flush
end

#generate_content_keyObject



105
106
107
108
109
110
111
# File 'lib/websocket_client/ietf_00.rb', line 105

def generate_content_key
  key = []
  'tacobob1'.each_byte do |byte|
    key << byte
  end
  key.pack('cccccccc')
end

#generate_header_keyObject



91
92
93
94
95
96
97
98
99
100
101
102
103
# File 'lib/websocket_client/ietf_00.rb', line 91

def generate_header_key
  key = '' 
  1.upto(32) do 
    key << rand(90) + 32
  end
  1.upto( rand(10) + 2 ) do
    key[rand(key.size-1)+1,1] = ' '
  end
  1.upto( rand(10) + 2 ) do
    key[rand(key.size-1)+1,1] = rand(9).to_s
  end
  key
end

#generate_keysObject



70
71
72
73
74
75
# File 'lib/websocket_client/ietf_00.rb', line 70

def generate_keys()
  key1 = generate_header_key
  key2 = generate_header_key
  key3 = generate_content_key
  [ key1, key2, key3, solve( key1, key2, key3 ) ]
end

#readline(socket) ⇒ Object



44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# File 'lib/websocket_client/ietf_00.rb', line 44

def readline(socket)
  line = ''
  while ( ! socket.eof? )
    if ( socket.respond_to? :getbyte )
      c = socket.getbyte
    else
      c = socket.getc
    end
    puts "> #{c} #{c.class} #{c == '\n'}"

    line << c

    if ( c == 10 )
      break
    end
  end
  line
end

#solve(key1, key2, key3) ⇒ Object



77
78
79
80
81
82
# File 'lib/websocket_client/ietf_00.rb', line 77

def solve(key1, key2, key3)
  int1 = solve_header_key( key1 )
  int2 = solve_header_key( key2 )
  input = int1.to_s + int2.to_s + key3
  Digest::MD5.digest( input )
end

#solve_header_key(key) ⇒ Object



84
85
86
87
88
89
# File 'lib/websocket_client/ietf_00.rb', line 84

def solve_header_key(key)
  key_digits = key.strip.gsub( /[^0-9]/, '').to_i
  key_spaces = key.strip.gsub( /[^ ]/, '').size
  solution = key_digits / key_spaces
  solution
end