メインコンテンツへスキップ

Go Proposal Weekly Digest

Go言語のproposal更新を毎週お届け

#78064accepted

x/net/http2: deprecate Transport and Server

ステータス変更: likely_accept accepted

要約

AIによる要約であり、誤りを含む場合があります。

概要

Go標準ライブラリへのHTTP/2統合が進んだことを受け、外部パッケージgolang.org/x/net/http2Transport型とServer型、および関連するAPIを非推奨(deprecated)にするproposalです。

ステータス変更

likely_acceptaccepted
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/http2Transport/Server型やその周辺APIは事実上重複した機能となり、メンテナンスコストや利用者の混乱(「どちらを使うべきか」という判断コスト)を生む要因になっていました。

提案された解決策

以下のシンボルを非推奨とすることが提案されました。

  • http2.Transporthttp2.Server(およびそれらのフィールド・メソッド全て)
  • ConfigureServerConfigureTransportConfigureTransports関数(HTTP/2設定用のヘルパー関数)
  • ClientConnClientConnState型(net/http.ClientConnに置き換えられたもの)
  • RoundTripOptServeConnOpts(非推奨となるTransport/Serverのメソッドでのみ使われるオプション型)
    これは先行するproposal #77695(ClientConnPoolなど接続プールAPIのみを非推奨にする提案)を包含する、より広範な非推奨化提案です。

これによって何ができるようになるか

net/httpパッケージの公開APIだけで、これまでx/net/http2を直接使わなければ実現できなかった機能(HTTP/2のみのクライアント・サーバー構成、コネクション単位の細かい制御など)がすべてカバーされるようになります。これにより、開発者は依存パッケージを一つ減らし、標準ライブラリのみでHTTP/2関連の実装を完結できます。
想定される主なユースケース:

  • HTTP/2専用のクライアント/サーバーを構築したい場合、net/http.Transportnet/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関連のみの非推奨化)を包含する、より広範囲な非推奨化提案として整理されています。

関連リンク