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

Go Proposal Weekly Digest

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

#78064likely_accept

x/net/http2: deprecate Transport and Server

ステータス変更: active likely_accept

要約

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

概要

golang.org/x/net/http2 パッケージの TransportServer をはじめとする主要な型と関数を非推奨(deprecated)にするproposal。net/http パッケージが HTTP/2 のすべての機能を直接サポートするようになったため、x/net/http2 の独自APIは不要になった。

ステータス変更

activelikely_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.TransportHTTP2 フィールドで HTTP/2 設定可)
http2.Server net/http.ServerHTTP2 フィールドで 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 非推奨となった TransportServer のメソッド専用だったため同時に不要化

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

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.Serverhttp2.Transport の設定フィールドを統合・代替している
  • 非推奨化はコードの削除ではなく、// Deprecated: コメントの追加であるため後方互換性は維持される
  • #67810 のトラッキングissueにある必須タスクのうち、本proposalが最後の未完了項目(#78064)だった

関連リンク