🤩
Erlang の HTTP サーバ Cowboy で WebSocket over HTTP/2 を動かす
概要
Erlang の HTTP サーバ Cowboy が WebSocket over HTTP/2 に対応していたので、動かしてみました。
まとめ
- Cowboy を HTTP/2 で動かしてオプションで
enable_connect_protocol => true
を渡すだけ - WebSocket ハンドラー部分は一切変更は不要
- RFC 8441 のテストも書いてある
HTTP/1.1 の WebSocket との違い
- アップグレードを使って新しく TCP をはらない
- WebSocket は HTTP/2 のストリームの一つとして扱われる
- CONNECT メソッドを拡張してブートストラップする
- SETTINGS_ENABLE_CONNECT_PROTOCOL を利用する
- HTTP/2 と WebSocket は TCP コネクションを共有する
chrome で取得したログ
CONNECT メソッドを拡張して接続しているのを確認できます
Erlang の コード
コードの一部です
Dispatch = cowboy_router:compile([
{'_', [{"/ws", ws_h, []}]}
]),
{ok, _Sup} = cowboy:start_tls(ws_over_http2,
[
{port, 4433},
{cacertfile, "cacert.pem"},
{certfile, "cert.pem"},
{keyfile, "key.pem"}
],
#{enable_connect_protocol => true,
env => #{dispatch => Dispatch}}
),
- 有効にするには enable_connect_protocol を true にするだけです
- HTTP/2 を TLS ALPN h2 を利用するため TLS を利用しています
Discussion