x/net/http2: deprecate Transport and Server
要約
概要
Go標準ライブラリへのHTTP/2統合が進んだことを受け、外部パッケージgolang.org/x/net/http2のTransport型とServer型、および関連するAPIを非推奨(deprecated)にするproposalです。
ステータス変更
likely_accept → accepted
2026年6月18日にレビュー対象(active)となり、6月25日時点で「likely accept」と判断されました。その後7月8日のレビューミーティングで「合意内容に変化がない(No change in consensus)」として正式にacceptedとなりました。議論の中で唯一寄せられた懸念(後述)についても、Go 1.26で追加されたAPIで解決済みであることが確認されたため、反対意見なく承認に至っています。
技術的背景
現状の問題点
これまでHTTP/2を扱うには、標準ライブラリのnet/httpではなく外部パッケージのgolang.org/x/net/http2を直接使う必要がある場面がありました。しかし、進行中のプロジェクト「x/net/http2をstdへ統合する」(#67810)の一環として、net/http側にHTTP/2固有の機能が次々と取り込まれてきました。その結果、x/net/http2のTransport/Server型やその周辺APIは事実上重複した機能となり、メンテナンスコストや利用者の混乱(「どちらを使うべきか」という判断コスト)を生む要因になっていました。
提案された解決策
以下のシンボルを非推奨とすることが提案されました。
http2.Transport、http2.Server(およびそれらのフィールド・メソッド全て)ConfigureServer、ConfigureTransport、ConfigureTransports関数(HTTP/2設定用のヘルパー関数)ClientConn、ClientConnState型(net/http.ClientConnに置き換えられたもの)RoundTripOpt、ServeConnOpts(非推奨となるTransport/Serverのメソッドでのみ使われるオプション型)
これは先行するproposal #77695(ClientConnPoolなど接続プールAPIのみを非推奨にする提案)を包含する、より広範な非推奨化提案です。
これによって何ができるようになるか
net/httpパッケージの公開APIだけで、これまでx/net/http2を直接使わなければ実現できなかった機能(HTTP/2のみのクライアント・サーバー構成、コネクション単位の細かい制御など)がすべてカバーされるようになります。これにより、開発者は依存パッケージを一つ減らし、標準ライブラリのみでHTTP/2関連の実装を完結できます。
想定される主なユースケース:
- HTTP/2専用のクライアント/サーバーを構築したい場合、
net/http.Transportやnet/http.ServerをHTTP/2のみ使うよう設定すれば良く、http2.ConfigureTransport等は不要になります。 - 低レベルなコネクション制御(プロキシ実装など)を行うライブラリ作者は、
net/http.Transport.NewClientConn(Go 1.26で追加)を使うことで、従来http2.ClientConnに依存していた機能を代替できます。 - HTTP/2の実装詳細を意識せず、
net/httpの統一的なAPIだけでHTTP/1.1・HTTP/2を切り替え可能なコードを書けるようになります。
コード例
// Before: x/net/http2 を直接使い、HTTP/2 のみのクライアントを構成
tr := &http2.Transport{
AllowHTTP: true,
DialTLSContext: dialFunc,
}
client := &http.Client{Transport: tr}
// After: net/http だけで HTTP/2 専用のクライアントを構成
tr := &http.Transport{
Protocols: new(http.Protocols),
}
tr.Protocols.SetHTTP2(true)
tr.Protocols.SetUnencryptedHTTP2(true)
client := &http.Client{Transport: tr}
// Before: プロキシ等で個別コネクションを扱う場合
cc, err := (&http2.Transport{}).NewClientConn(conn)
// After: net/http の ClientConn API を利用(Go 1.26〜)
cc, err := tr.NewClientConn(conn)
議論のハイライト
- 提案の中心は「
x/net/http2のあらゆる機能はすでにnet/httpの公開APIで実現可能になった」という前提であり、これはx/net/http2をstdへ統合する大規模プロジェクト(#67810)の一部として位置づけられています。 - コントリビューターの@andybalholmから、HTTPプロキシ実装(redwood)でクライアント/サーバー間の接続を1対1でHTTPバージョンをそろえて管理するために
http2パッケージの低レベルAPIを直接使っているとの懸念が示されました。 - これに対し@neild(コアチームメンバー)が、Go 1.26で追加された
net/http.Transport.NewClientConnが同等以上の機能を提供すると回答しました。 - @andybalholm自身が実際にコードを移行し、Go 1.26のAPIでギャップが埋まっていたことを確認・報告したことで、懸念が解消されました。
- 本proposalは先行する部分的な提案 #77695(
ClientConnPool関連のみの非推奨化)を包含する、より広範囲な非推奨化提案として整理されています。