WebSocket接続時にブラウザから送られてくるもの 2012年4月版


お遊びでWebSocket鯖をC++で書いているんですが、そういえばハンドシェイク時にブラウザから送られてくる物が違ったらどうしよー?と思って、とりあえず調べてみました。

接続用の処理抜粋。

            var ws;
            if ("WebSocket" in window) {
                ws = new WebSocket("ws://localhost:9000/wstest");
            } else if ("MozWebSocket" in window) {
                ws = new MozWebSocket("ws://localhost:9000/wstest");
            }

Firefox12の場合

GET /wstest HTTP/1.1
Host: localhost:9000
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:11.0) Gecko/20100101 Firefox/11.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ja,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive, Upgrade
Sec-WebSocket-Version: 13
Origin: null
Sec-WebSocket-Key: ixfqjAv8pFpxK+q4BE0/Pw==
Pragma: no-cache
Cache-Control: no-cache
Upgrade: websocket

Google Chrome18の場合

GET /wstest HTTP/1.1
Upgrade: websocket
Connection: Upgrade
Host: localhost:9000
Origin: null
Sec-WebSocket-Key: YkFjVGzn3GLXQfHBQGrKtw==
Sec-WebSocket-Version: 13

Safari5の場合

GET /wstest HTTP/1.1
Upgrade: WebSocket
Connection: Upgrade
Host: localhost:9000
Origin: file://
Sec-WebSocket-Key1: '1nxu203!1_u82 47)8
Sec-WebSocket-Key2: I3z23: 913 7 jn}0W v4~

Y\261"k\360\330o

Safariはバージョンが古いみたいです。
Sec-WebSocket-Key1とSec-WebSocket-Key2の数字の部分とスペースの個数で云々する、キモいタイプのやつですね。

そしてFirefoxとChromeは、Sec-WebSocket-Keyに「258EAFA5-E914-47DA-95CA-C5AB0DC85B11」というマジック文字列を連結して、SHA-1したのをbase64にしてクライアントへのレスポンスで使うタイプのやつですね。

・・・
さようならSafariたん!

Leave a Comment