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

Go Proposal Weekly Digest

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

#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.Transportnet/http.ServerProtocols フィールドでHTTP/2のみを使うよう設定できる
  • ConfigureServerConfigureTransportConfigureTransports 関数: 歴史的に net/http クライアント・サーバーへHTTP/2設定を適用するために使われていたが、net/http が直接設定をサポートするようになった
  • ClientConnおよび ClientConnState: Go 1.26で追加された net/http.ClientConn に完全に取って代わられた
  • RoundTripOptServeConnOpts: deprecated対象の TransportServer のメソッドでのみ使用されるオプション型

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

ユーザーは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は TransportServer 型全体に対象を拡大している
  • 実プロキシ実装での検証: 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」の状態であり、具体的な承認・否決はまだ行われていない

関連リンク