🤩

Erlang の HTTP サーバ Cowboy で WebSocket over HTTP/2 を動かす

2021/04/18に公開

概要

Erlang の HTTP サーバ Cowboy が WebSocket over HTTP/2 に対応していたので、動かしてみました。

まとめ

HTTP/1.1 の WebSocket との違い

  • アップグレードを使って新しく TCP をはらない
  • WebSocket は HTTP/2 のストリームの一つとして扱われる
  • CONNECT メソッドを拡張してブートストラップする
  • SETTINGS_ENABLE_CONNECT_PROTOCOL を利用する
  • HTTP/2 と WebSocket は TCP コネクションを共有する

chrome で取得したログ

CONNECT メソッドを拡張して接続しているのを確認できます

Image from Gyazo

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