#78064active
x/net/http2: deprecate Transport and Server
新規提案
要約
AIによる要約であり、誤りを含む場合があります。
概要
golang.org/x/net/http2 パッケージの Transport 型および Server 型(および関連する型・関数)をdeprecatedにするproposal。Go 1.26以降、これらの型が提供していた全機能が標準ライブラリの net/http パッケージで代替可能になったため、長年続いていた x/net/http2 の標準ライブラリへの移行プロジェクト(#67810)の一環として提案された。
ステータス変更
(なし) → active
2026-06-17のProposal Review Meeting(@cherrymui, @griesemer, @ianlancetaylor, @neild)でweeklyレビューキューのactiveカラムに追加された。「added to minutes」とのみ記録されており、まだ議論の継続段階にある。
技術的背景
現状の問題点
golang.org/x/net/http2 パッケージはもともと、標準ライブラリの外でHTTP/2実装を開発するために作られた。しかし現在の状況は複雑で不便な状態が続いていた。
- HTTP/2の修正をマイナーリリースにバックポートするのが難しい
net/httpの新バージョンがx/netの古いバージョンをサポートし続ける必要がある- HTTP/1とHTTP/2の実装をアトミックに変更できない
- HTTP/2の設定をするためにユーザーが外部の
x/パッケージをインポートしなければならない
これらの問題を解消するため、HTTP/2実装を標準ライブラリへ移行するプロジェクト(#67810)が進められてきた。Go 1.26でnet/http.Transport.NewClientConnが追加されたことで、x/net/http2の主要なAPIが全て標準ライブラリで代替可能になった。
提案された解決策
以下の型・関数を x/net/http2 パッケージでdeprecatedにする。
Transport型および**Server型**(フィールド・メソッドも含む): HTTP/2専用のクライアント・サーバーが必要な場合は、net/http.Transportやnet/http.ServerのProtocolsフィールドでHTTP/2のみを使うよう設定できるConfigureServer、ConfigureTransport、ConfigureTransports関数: 歴史的にnet/httpクライアント・サーバーへHTTP/2設定を適用するために使われていたが、net/httpが直接設定をサポートするようになったClientConn型およびClientConnState型: Go 1.26で追加されたnet/http.ClientConnに完全に取って代わられたRoundTripOpt、ServeConnOpts型: deprecated対象のTransport・Serverのメソッドでのみ使用されるオプション型
これによって何ができるようになるか
ユーザーはHTTP/2の設定・制御を x/net/http2 をimportせずに、標準の net/http パッケージだけで行えるようになる。
コード例
// Before: x/net/http2 を使ったHTTP/2専用サーバーの設定
import "golang.org/x/net/http2"
server := &http.Server{Addr: ":8080", Handler: myHandler}
http2.ConfigureServer(server, &http2.Server{
MaxConcurrentStreams: 100,
})
server.ListenAndServeTLS("cert.pem", "key.pem")
// After: net/http の HTTP2 フィールドを使った設定(Go 1.26以降)
import "net/http"
server := &http.Server{
Addr: ":8080",
Handler: myHandler,
HTTP2: &http.HTTP2Config{
MaxConcurrentStreams: 100,
},
}
server.ListenAndServeTLS("cert.pem", "key.pem")
// Before: x/net/http2.Transport を使ったHTTP/2専用クライアント接続
import "golang.org/x/net/http2"
t2 := &http2.Transport{}
conn, err := t2.NewClientConn(netConn)
// After: net/http.Transport.NewClientConn を使った接続(Go 1.26以降)
import "net/http"
t := &http.Transport{}
conn, err := t.NewClientConn(ctx, "https", "example.com:443")
議論のハイライト
- Go 1.26で最後のギャップが埋まった:
net/http.Transport.NewClientConn(#75772)の追加により、x/net/http2の低レベルクライアント接続APIも標準ライブラリで完全に代替可能になった。これがdeprecation提案の直接的なトリガーとなった - 本proposalは #77695 のスーパーセット: #77695 がクライアント接続API(
ClientConnPoolなど)のみのdeprecationを提案していたのに対し、本proposalはTransport・Server型全体に対象を拡大している - 実プロキシ実装での検証:
github.com/andybalholm/redwood(HTTPプロキシ)の開発者が「クライアント・サーバー間の接続を1対1でマッピングするためにx/net/http2を直接使っていた」と懸念を表明したが、Go 1.26で必要な機能が全て標準ライブラリに追加されたことをコードで確認し、懸念を解消した(#78064コメント参照) - 段階的な移行プロジェクトの最終段階: #67810 のトラッキングissueによると、この提案の完了をもってx/net/http2の標準ライブラリへの移行プロジェクトが実質的に完了する見込み
- まだactiveレビュー段階: 本稿時点(2026-06-18)では「added to minutes」の状態であり、具体的な承認・否決はまだ行われていない