Class: WebSocketClient::Ietf00
- Inherits:
-
Object
- Object
- WebSocketClient::Ietf00
- Defined in:
- lib/websocket_client/ietf_00.rb
Instance Method Summary collapse
- #encode_text_message(msg) ⇒ Object
- #generate_content_key ⇒ Object
- #generate_header_key ⇒ Object
- #generate_keys ⇒ Object
-
#initialize(uri, socket) ⇒ Ietf00
constructor
A new instance of Ietf00.
- #readline(socket) ⇒ Object
- #solve(key1, key2, key3) ⇒ Object
- #solve_header_key(key) ⇒ Object
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 (msg) @socket.putc 0x00 @socket.print msg @socket.putc 0xFF @socket.flush end |
#generate_content_key ⇒ Object
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_key ⇒ Object
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_keys ⇒ Object
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 |