x/net/http2: deprecate Transport and Server
要約
概要
golang.org/x/net/http2 パッケージの Transport・Server をはじめとする主要な型と関数を非推奨(deprecated)にするproposal。net/http パッケージが HTTP/2 のすべての機能を直接サポートするようになったため、x/net/http2 の独自APIは不要になった。
ステータス変更
active → likely_accept
net/http 側のAPI整備が完了し、x/net/http2 の各型・関数の代替がすべて揃ったと判断された。議論では「機能の重複がなくなった」という点が確認され、既存ユーザへの影響も限定的と見なされた。aclements が 2026-06-25 に likely accept と判定した。
技術的背景
現状の問題点
golang.org/x/net/http2 パッケージは net/http の HTTP/2 実装の発祥地であり、長年にわたって net/http のバックエンドとして機能してきた。ユーザが HTTP/2 の詳細な設定を行いたい場合、x/net/http2 を直接インポートして使用する必要があった。
// 従来: HTTP/2 設定のために x/net/http2 を直接使う
import "golang.org/x/net/http2"
s := &http.Server{Addr: ":443"}
h2s := &http2.Server{
MaxConcurrentStreams: 100,
IdleTimeout: 30 * time.Second,
}
http2.ConfigureServer(s, h2s)
s.ListenAndServeTLS("cert.pem", "key.pem")
この状況の問題点は複数あった。HTTP/2 バグの修正を minor release にバックポートするのが困難、HTTP/1 と HTTP/2 の実装を atomic に変更できない、ユーザが x/ パッケージを追加インポートしなければならない、といった点だ。
提案された解決策
#67810("net/http: move HTTP/2 into std")として追跡されてきた大きなプロジェクトの一環として、以下の対応が完了した後、x/net/http2 の各APIを deprecated にする。
| 非推奨対象 | 代替 |
|---|---|
http2.Transport |
net/http.Transport(HTTP2 フィールドで HTTP/2 設定可) |
http2.Server |
net/http.Server(HTTP2 フィールドで HTTP/2 設定可) |
http2.ConfigureServer |
net/http.Server.HTTP2 フィールドによる直接設定 |
http2.ConfigureTransport / ConfigureTransports |
net/http.Transport.HTTP2 フィールドによる直接設定 |
http2.ClientConn / ClientConnState |
net/http.ClientConn(Go 1.26 で追加) |
http2.RoundTripOpt / ServeConnOpts |
非推奨となった Transport・Server のメソッド専用だったため同時に不要化 |
これによって何ができるようになるか
x/net/http2 への依存を除去し、net/http のみで HTTP/2 の全機能を制御できるようになる。これにより依存関係がシンプルになり、将来の標準ライブラリへの完全な統合がスムーズに行える。
コード例
// Before: HTTP/2 の詳細設定に x/net/http2 が必要だった
import (
"net/http"
"golang.org/x/net/http2"
)
tr := &http.Transport{}
http2.ConfigureTransport(tr)
h2tr := &http2.Transport{
MaxHeaderListSize: 1 << 20,
ReadIdleTimeout: 30 * time.Second,
}
client := &http.Client{Transport: h2tr}
// After: net/http だけで完結する(Go 1.26 以降)
import "net/http"
tr := &http.Transport{
HTTP2: http.HTTP2Config{
MaxReadFrameSize: 1 << 20,
SendPingTimeout: 30 * time.Second,
},
}
client := &http.Client{Transport: tr}
// Before: 1対1接続の制御に x/net/http2 の ClientConn が必要
import "golang.org/x/net/http2"
h2tr := &http2.Transport{}
conn, _ := h2tr.NewClientConn(rawConn)
resp, _ := conn.RoundTrip(req)
// After: net/http.Transport.NewClientConn を使う(Go 1.26 以降)
import "net/http"
tr := &http.Transport{}
conn, _ := tr.NewClientConn(ctx, "https", "example.com:443")
resp, _ := conn.RoundTrip(req)
議論のハイライト
andybalholmがHTTPプロキシ実装(github.com/andybalholm/redwood)における低レベル制御の必要性を懸念として提起したが、Go 1.26 のnet/http.Transport.NewClientConnで必要な機能がすべてカバーされることを確認した- このproposalは
#77695(ClientConnPool のみを非推奨にする提案)を包含するより広い範囲の提案として設計された。#77695は#78064に取って代わられたとしてneildがクローズした net/http.HTTP2Config構造体(#67813で追加)がhttp2.Serverとhttp2.Transportの設定フィールドを統合・代替している- 非推奨化はコードの削除ではなく、
// Deprecated:コメントの追加であるため後方互換性は維持される #67810のトラッキングissueにある必須タスクのうち、本proposalが最後の未完了項目(#78064)だった