ブラウザから送出されるWebSocketハンドシェイクを取得

WebSocketプロトコルRubyTCPServerのお勉強を兼ねて、WebブラウザからWebSocketサーバへの接続時に、ブラウザが送出するハンドシェイクの内容を取得してみます。

参考情報:

動作環境:

TCPサーバ

RubyリファレンスマニュアルのTCPServerクラス中のサンプルほぼそのままです。
WebSocketのハンドシェイク中のヘッダフィールドをテキトーに解釈しています。

ws_handshake.rb:

require 'socket'

server = TCPServer.new(8000)

while true
  Thread.start(server.accept) do |s|
    while line = s.gets.chomp
      case line
      when /^GET/
        puts line
      when /^\S+?\: \S+$/
        puts line
      else
        break
      end
    end
    s.close
  end
end

サーバ起動:

$ ruby ws_handshake.rb # 8000/tcpで待ち受け

ブラウザからの出力

ここでは、ChromeJavaスクリプトコンソールから、先ほど開いたサーバポートにWebSocketプロトコルで接続してみます。

> new WebSocket('ws://localhost:8000/test');

すると、先ほどサーバを起動したターミナル上に、以下のように表示されます。

GET /test HTTP/1.1
Upgrade: websocket
Connection: Upgrade
Host: localhost:8000
Origin: chrome://newtab
Sec-WebSocket-Key: l25AVE4wwuIb6Ed/qlreGg==
Sec-WebSocket-Version: 13
Sec-WebSocket-Extensions: x-webkit-deflate-frame

リンク先の解説によると、これだけではWebSocketプロトコルバージョンは特定できず、hybi-13〜RFC 6455のいずれかのバージョンであることが分かることになります。