Go Conference mini 2023 Winter IN KYOTO
HTTP 通信を提供する標準ライブラリ net/http は トランスポート層(L4)以下のプロトコルを意識する必要がないように設計されています。これにより、コネクションの再利用やプールのような複雑な処理を深く考えることなく Go で HTTP 通信を利用することができます。
しかし一方で、 TCP コネクションを表す net.Conn を http.Client, Server 構造体から取り出して直接操作することが難しくなっています。例えば、リバースプロキシなどで利用される PROXY Protocol というプロトコルは、 トランスポート層(L4)プロトコルのペイロードの先頭、つまりアプリケーション層(L7)プロトコルのデータの直前で追加のデータを読み書きします。そのためこのプロトコルを Go で実装する際には、 http.Client, Server 構造体の持つ net.Conn に直接読み書きする必要があります。
こういった方法の解説はウェブ上に乏しく、 net/http や net のコードをかなり詳しく読まないと分からないのが現状です。
今回のLTでは、 net/http や net.Conn について簡単に解説しながら、HTTP の Client, Server それぞれにおいて net.Conn を取得する方法とその実用例を紹介します。