ブラウザから送出されるWebSocketハンドシェイクを取得
WebSocketプロトコルとRubyのTCPServerのお勉強を兼ねて、WebブラウザからWebSocketサーバへの接続時に、ブラウザが送出するハンドシェイクの内容を取得してみます。
参考情報:
- 1.WebSocket仕様解説 実装WebSocketクライアント対応プロトコルバージョン確認編 (2012/09/28 Update) - gtk2kの日記
- RFC 6455 - The WebSocket Protocol / http://www.hcn.zaq.ne.jp/___/WEB/RFC6455-ja.html
- Ruby 1.9.3 リファレンスマニュアル > TCPServerクラス
動作環境:
- Linux Mint 13 (64ビット版)
- Ruby 1.9.3-p194
- Google Chrome 20.0.1132.47
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で待ち受け
ブラウザからの出力
ここでは、ChromeのJavaスクリプトコンソールから、先ほど開いたサーバポートに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のいずれかのバージョンであることが分かることになります。