vendor: golang.org/x/net v0.59.0

Notable changes:

- all: upgrade go directive to at least 1.26.0
- http2: deprecate Transport and Server
- http2: use IDNA Lookup profile, not raw Punycode translation
    - addresses https://github.com/golang/go/issues/81010
- internal/httpcommon: remove Host header from server request

full diff: https://github.com/golang/net/compare/v0.58.0...v0.59.0

Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
This commit is contained in:
Sebastiaan van Stijn
2026-09-14 17:31:14 +02:00
parent b0a6803f9b
commit 60dffc9412
12 changed files with 183 additions and 22 deletions
+1 -1
View File
@@ -102,7 +102,7 @@ require (
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.46.0 // indirect
go.opentelemetry.io/proto/otlp v1.11.0 // indirect
golang.org/x/mod v0.41.0 // indirect
golang.org/x/net v0.58.0 // indirect
golang.org/x/net v0.59.0 // indirect
golang.org/x/time v0.16.0 // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20260825221802-da73d73af1c5 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20260825221802-da73d73af1c5 // indirect
+2 -2
View File
@@ -193,8 +193,8 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.58.0 h1:ynWG7rqYi4ccpTEuPZ2QGWHktVEM9DMCj9yzDE0Q7To=
golang.org/x/net v0.58.0/go.mod h1:YwCddHnFlT7eLQqVprV19OnhLGtc5xOKgE0RyqgfWAU=
golang.org/x/net v0.59.0 h1:5zfYln+w5XCxwrnMMJPufRgNoXEaGxl0wo5GqPXyues=
golang.org/x/net v0.59.0/go.mod h1:2DA/G1UfVbCpQPeWTmMPGY7Cs2PkBkwu743bVX5PIVg=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+13 -1
View File
@@ -4,7 +4,9 @@
package http2
import "strings"
import (
"strings"
)
// The HTTP protocols are defined in terms of ASCII, not Unicode. This file
// contains helper functions which may use Unicode-aware functions which would
@@ -43,6 +45,16 @@ func isASCIIPrint(s string) bool {
return true
}
// isASCII returns whether s is ASCII.
func isASCII(s string) bool {
for i := 0; i < len(s); i++ {
if s[i] > 0x7f {
return false
}
}
return true
}
// asciiToLower returns the lowercase version of s if s is ASCII and printable,
// and whether or not it was.
func asciiToLower(s string) (lower string, ok bool) {
+1 -4
View File
@@ -121,10 +121,7 @@ func (b *dataBuffer) Write(p []byte) (int, error) {
// If the last chunk is empty, allocate a new chunk. Try to allocate
// enough to fully copy p plus any additional bytes we expect to
// receive. However, this may allocate less than len(p).
want := int64(len(p))
if b.expected > want {
want = b.expected
}
want := max(int64(len(p)), b.expected)
chunk := b.lastChunkOrAlloc(want)
n := copy(chunk[b.w:], p)
p = p[n:]
+47
View File
@@ -25,6 +25,8 @@ import (
//
// https://golang.org/pkg/net/http/#ResponseWriter
// https://golang.org/pkg/net/http/#example_ResponseWriter_trailers
//
// Deprecated: Use [http.TrailerPrefix] instead.
const TrailerPrefix = "Trailer:"
// Push errors.
@@ -38,16 +40,22 @@ var (
// The configuration conf may be nil.
//
// ConfigureServer must be called before s begins serving.
//
// Deprecated: Set [http.Server.Protocols] instead.
func ConfigureServer(s *http.Server, conf *Server) error {
return configureServer(s, conf)
}
// Server is an HTTP/2 server.
//
// Deprecated: Use [http.Server] instead.
type Server struct {
// MaxHandlers limits the number of http.Handler ServeHTTP goroutines
// which may run at a time over all connections.
// Negative or zero no limit.
// TODO: implement
//
// Deprecated: This field has never had any effect.
MaxHandlers int
// MaxConcurrentStreams optionally specifies the number of
@@ -56,6 +64,9 @@ type Server struct {
// which may be active globally, which is MaxHandlers.
// If zero, MaxConcurrentStreams defaults to at least 100, per
// the HTTP/2 spec's recommendations.
//
// Deprecated: Use [http.Server.HTTP2] and
// [http.HTTP2Config.MaxConcurrentStreams] instead.
MaxConcurrentStreams uint32
// MaxDecoderHeaderTableSize optionally specifies the http2
@@ -63,44 +74,67 @@ type Server struct {
// informs the remote endpoint of the maximum size of the header compression
// table used to decode header blocks, in octets. If zero, the default value
// of 4096 is used.
//
// Deprecated: Use [http.Server.HTTP2] and
// [http.HTTP2Config.MaxDecoderHeaderTableSize] instead.
MaxDecoderHeaderTableSize uint32
// MaxEncoderHeaderTableSize optionally specifies an upper limit for the
// header compression table used for encoding request headers. Received
// SETTINGS_HEADER_TABLE_SIZE settings are capped at this limit. If zero,
// the default value of 4096 is used.
//
// Deprecated: Use [http.Server.HTTP2] and
// [http.HTTP2Config.MaxEncoderHeaderTableSize] instead.
MaxEncoderHeaderTableSize uint32
// MaxReadFrameSize optionally specifies the largest frame
// this server is willing to read. A valid value is between
// 16k and 16M, inclusive. If zero or otherwise invalid, a
// default value is used.
//
// Deprecated: Use [http.Server.HTTP2] and
// [http.HTTP2Config.MaxReadFrameSize] instead.
MaxReadFrameSize uint32
// PermitProhibitedCipherSuites, if true, permits the use of
// cipher suites prohibited by the HTTP/2 spec.
//
// Deprecated: Use [http.Server.HTTP2] and
// [http.HTTP2Config.PermitProhibitedCipherSuites] instead.
PermitProhibitedCipherSuites bool
// IdleTimeout specifies how long until idle clients should be
// closed with a GOAWAY frame. PING frames are not considered
// activity for the purposes of IdleTimeout.
// If zero or negative, there is no timeout.
//
// Deprecated: Use [http.Server.IdleTimeout] instead.
IdleTimeout time.Duration
// ReadIdleTimeout is the timeout after which a health check using a ping
// frame will be carried out if no frame is received on the connection.
// If zero, no health check is performed.
//
// Deprecated: Use [http.Server.HTTP2] and
// [http.HTTP2Config.SendPingTimeout] instead.
ReadIdleTimeout time.Duration
// PingTimeout is the timeout after which the connection will be closed
// if a response to a ping is not received.
// If zero, a default of 15 seconds is used.
//
// Deprecated: Use [http.Server.HTTP2] and
// [http.HTTP2Config.PingTimeout] instead.
PingTimeout time.Duration
// WriteByteTimeout is the timeout after which a connection will be
// closed if no data can be written to it. The timeout begins when data is
// available to write, and is extended whenever any bytes are written.
// If zero or negative, there is no timeout.
//
// Deprecated: Use [http.Server.HTTP2] and
// [http.HTTP2Config.WriteByteTimeout] instead.
WriteByteTimeout time.Duration
// MaxUploadBufferPerConnection is the size of the initial flow
@@ -108,12 +142,18 @@ type Server struct {
// allow this to be smaller than 65535 or larger than 2^32-1.
// If the value is outside this range, a default value will be
// used instead.
//
// Deprecated: Use [http.Server.HTTP2] and
// [http.HTTP2Config.MaxReceiveBufferPerConnection] instead.
MaxUploadBufferPerConnection int32
// MaxUploadBufferPerStream is the size of the initial flow control
// window for each stream. The HTTP/2 spec does not allow this to
// be larger than 2^32-1. If the value is zero or larger than the
// maximum, a default value will be used instead.
//
// Deprecated: Use [http.Server.HTTP2] and
// [http.HTTP2Config.MaxReceiveBufferPerStream] instead.
MaxUploadBufferPerStream int32
// NewWriteScheduler constructs a write scheduler for a connection.
@@ -126,6 +166,9 @@ type Server struct {
// It's intended to increment a metric for monitoring, such
// as an expvar or Prometheus metric.
// The errType consists of only ASCII word characters.
//
// Deprecated: Use [http.Server.HTTP2] and
// [http.HTTP2Config.CountError] instead.
CountError func(errType string)
// Internal state. This is a pointer (rather than embedded directly)
@@ -135,6 +178,8 @@ type Server struct {
}
// ServeConnOpts are options for the Server.ServeConn method.
//
// Deprecated: ServeConnOpts is deprecated.
type ServeConnOpts struct {
// Context is the base context to use.
// If nil, context.Background is used.
@@ -178,6 +223,8 @@ type ServeConnOpts struct {
// implemented in terms of providing a suitably-behaving net.Conn.
//
// The opts parameter is optional. If nil, default values are used.
//
// Deprecated: Use [http.Server.Serve] or [http.Server.ServeTLS] instead.
func (s *Server) ServeConn(c net.Conn, opts *ServeConnOpts) {
if opts == nil {
opts = &ServeConnOpts{}
+2
View File
@@ -184,6 +184,8 @@ func (t *Transport) initConnPool() {
// ClientConn is the state of a single HTTP/2 client connection to an
// HTTP/2 server.
//
// Deprecated: Use [http.ClientConn] instead.
type ClientConn struct {
t *Transport
tconn net.Conn // usually *tls.Conn, except specialized impls
+74 -5
View File
@@ -24,6 +24,8 @@ import (
// It returns an error if t1 has already been HTTP/2-enabled.
//
// Use ConfigureTransports instead to configure the HTTP/2 Transport.
//
// Deprecated: Set [http.Transport.Protocols] instead.
func ConfigureTransport(t1 *http.Transport) error {
return configureTransport(t1)
}
@@ -31,6 +33,8 @@ func ConfigureTransport(t1 *http.Transport) error {
// ConfigureTransports configures a net/http HTTP/1 Transport to use HTTP/2.
// It returns a new HTTP/2 Transport for further configuration.
// It returns an error if t1 has already been HTTP/2-enabled.
//
// Deprecated: Set [http.Transport.Protocols] instead.
func ConfigureTransports(t1 *http.Transport) (*Transport, error) {
return configureTransports(t1)
}
@@ -39,6 +43,8 @@ func ConfigureTransports(t1 *http.Transport) (*Transport, error) {
//
// A Transport internally caches connections to servers. It is safe
// for concurrent use by multiple goroutines.
//
// Deprecated: Use [http.Transport] instead.
type Transport struct {
// DialTLSContext specifies an optional dial function with context for
// creating TLS connections for requests.
@@ -47,6 +53,8 @@ type Transport struct {
//
// If the returned net.Conn has a ConnectionState method like tls.Conn,
// it will be used to set http.Response.TLS.
//
// Deprecated: Use [http.Transport.DialTLSContext] instead.
DialTLSContext func(ctx context.Context, network, addr string, cfg *tls.Config) (net.Conn, error)
// DialTLS specifies an optional dial function for creating
@@ -54,17 +62,21 @@ type Transport struct {
//
// If DialTLSContext and DialTLS is nil, tls.Dial is used.
//
// Deprecated: Use DialTLSContext instead, which allows the transport
// to cancel dials as soon as they are no longer needed.
// If both are set, DialTLSContext takes priority.
// Deprecated: Use [http.Transport.DialTLSContext] instead.
DialTLS func(network, addr string, cfg *tls.Config) (net.Conn, error)
// TLSClientConfig specifies the TLS configuration to use with
// tls.Client. If nil, the default configuration is used.
//
// Deprecated: Use [http.Transport.TLSClientConfig] instead.
TLSClientConfig *tls.Config
// ConnPool optionally specifies an alternate connection pool to use.
// If nil, the default is used.
//
// Deprecated: To create a custom connection pool, implement
// [http.RoundTripper]. Use [http.Transport.NewClientConn]
// to create connections for the pool.
ConnPool ClientConnPool
// DisableCompression, if true, prevents the Transport from
@@ -75,10 +87,14 @@ type Transport struct {
// decoded in the Response.Body. However, if the user
// explicitly requested gzip it is not automatically
// uncompressed.
//
// Deprecated: Use [http.Transport.DisableCompression] instead.
DisableCompression bool
// AllowHTTP, if true, permits HTTP/2 requests using the insecure,
// plain-text "http" scheme. Note that this does not enable h2c support.
//
// Deprecated: Use [http.Transport.Protocols] instead.
AllowHTTP bool
// MaxHeaderListSize is the http2 SETTINGS_MAX_HEADER_LIST_SIZE to
@@ -88,6 +104,8 @@ type Transport struct {
// want to advertise an unlimited value to the peer, Transport
// interprets the highest possible value here (0xffffffff or 1<<32-1)
// to mean no limit.
//
// Deprecated: Use [http.Transport.MaxResponseHeaderBytes] instead.
MaxHeaderListSize uint32
// MaxReadFrameSize is the http2 SETTINGS_MAX_FRAME_SIZE to send in the
@@ -97,6 +115,9 @@ type Transport struct {
// according to the spec:
// https://datatracker.ietf.org/doc/html/rfc7540#section-6.5.2.
// Values are bounded in the range 16k to 16M.
//
// Deprecated: Use [http.Transport.HTTP2] and
// [http.HTTP2Config.MaxReadFrameSize] instead.
MaxReadFrameSize uint32
// MaxDecoderHeaderTableSize optionally specifies the http2
@@ -104,12 +125,18 @@ type Transport struct {
// informs the remote endpoint of the maximum size of the header compression
// table used to decode header blocks, in octets. If zero, the default value
// of 4096 is used.
//
// Deprecated: Use [http.Transport.HTTP2] and
// [http.HTTP2Config.MaxDecoderHeaderTableSize] instead.
MaxDecoderHeaderTableSize uint32
// MaxEncoderHeaderTableSize optionally specifies an upper limit for the
// header compression table used for encoding request headers. Received
// SETTINGS_HEADER_TABLE_SIZE settings are capped at this limit. If zero,
// the default value of 4096 is used.
//
// Deprecated: Use [http.Transport.HTTP2] and
// [http.HTTP2Config.MaxEncoderHeaderTableSize] instead.
MaxEncoderHeaderTableSize uint32
// StrictMaxConcurrentStreams controls whether the server's
@@ -120,12 +147,17 @@ type Transport struct {
// server's SETTINGS_MAX_CONCURRENT_STREAMS is interpreted as
// a global limit and callers of RoundTrip block when needed,
// waiting for their turn.
//
// Deprecated: Use [http.Transport.HTTP2] and
// [http.HTTP2Config.StrictMaxConcurrentRequests] instead.
StrictMaxConcurrentStreams bool
// IdleConnTimeout is the maximum amount of time an idle
// (keep-alive) connection will remain idle before closing
// itself.
// Zero means no limit.
//
// Deprecated: Use [http.Transport.IdleConnTimeout] instead.
IdleConnTimeout time.Duration
// ReadIdleTimeout is the timeout after which a health check using ping
@@ -134,22 +166,34 @@ type Transport struct {
// there is no other traffic on the connection, the health check will
// be performed every ReadIdleTimeout interval.
// If zero, no health check is performed.
//
// Deprecated: Use [http.Transport.HTTP2] and
// [http.HTTP2Config.SendPingTimeout] instead.
ReadIdleTimeout time.Duration
// PingTimeout is the timeout after which the connection will be closed
// if a response to Ping is not received.
// Defaults to 15s.
//
// Deprecated: Use [http.Transport.HTTP2] and
// [http.HTTP2Config.PingTimeout] instead.
PingTimeout time.Duration
// WriteByteTimeout is the timeout after which the connection will be
// closed no data can be written to it. The timeout begins when data is
// available to write, and is extended whenever any bytes are written.
//
// Deprecated: Use [http.Transport.HTTP2] and
// [http.HTTP2Config.WriteByteTimeout] instead.
WriteByteTimeout time.Duration
// CountError, if non-nil, is called on HTTP/2 transport errors.
// It's intended to increment a metric for monitoring, such
// as an expvar or Prometheus metric.
// The errType consists of only ASCII word characters.
//
// Deprecated: Use [http.Transport.HTTP2] and
// [http.HTTP2Config.CountError] instead.
CountError func(errType string)
// Internal state, differs between wrapped and non-wrapped implementations.
@@ -165,6 +209,10 @@ var (
)
// ClientConnPool manages a pool of HTTP/2 client connections.
//
// Deprecated: To create a custom connection pool, implement
// [http.RoundTripper]. Use [http.Transport.NewClientConn]
// to create connections for the pool.
type ClientConnPool interface {
// GetClientConn returns a specific HTTP/2 connection (usually
// a TLS-TCP connection) to an HTTP/2 server. On success, the
@@ -177,6 +225,8 @@ type ClientConnPool interface {
}
// ClientConnState describes the state of a ClientConn.
//
// Deprecated: Use [http.ClientConn] instead.
type ClientConnState struct {
// Closed is whether the connection is closed.
Closed bool
@@ -210,6 +260,8 @@ type ClientConnState struct {
}
// RoundTripOpt are options for the Transport.RoundTripOpt method.
//
// Deprecated: There are no options to set.
type RoundTripOpt struct {
// OnlyCachedConn controls whether RoundTripOpt may
// create a new TCP connection. If set true and
@@ -222,11 +274,14 @@ type RoundTripOpt struct {
allowHTTP bool // allow http:// URLs
}
// Deprecated: Use [http.Transport.RoundTrip] instead.
func (t *Transport) RoundTrip(req *http.Request) (*http.Response, error) {
return t.RoundTripOpt(req, RoundTripOpt{})
}
// RoundTripOpt is like RoundTrip, but takes options.
//
// Deprecated: Use [http.Transport.RoundTrip] instead.
func (t *Transport) RoundTripOpt(req *http.Request, opt RoundTripOpt) (*http.Response, error) {
return t.roundTripOpt(req, opt)
}
@@ -234,10 +289,15 @@ func (t *Transport) RoundTripOpt(req *http.Request, opt RoundTripOpt) (*http.Res
// CloseIdleConnections closes any connections which were previously
// connected from previous requests but are now sitting idle.
// It does not interrupt any connections currently in use.
//
// Deprecated: Use [http.Transport.CloseIdleConnections] instead.
func (t *Transport) CloseIdleConnections() {
t.closeIdleConnections()
}
// NewClientConn is deprecated.
//
// Deprecated: Use [http.Transport.NewClientConn] instead.
func (t *Transport) NewClientConn(c net.Conn) (*ClientConn, error) {
return t.newUserClientConn(c)
}
@@ -256,8 +316,15 @@ func authorityAddr(scheme string, authority string) (addr string) {
port = "80"
}
}
if a, err := idna.ToASCII(host); err == nil {
host = a
// Skip IDNA processing on hosts which are already ASCII.
// This is consistent with net/http and the WHATWG URL Specification.
// (We currently don't follow all of WHATWG, but we're aligned on
// permitting all-ASCII hostnames which fail IDNA validation.
// There are existing, valid domain names which TR #46 processing rejects.)
if !isASCII(host) {
if a, err := idna.Lookup.ToASCII(host); err == nil && a != "" {
host = a
}
}
// IPv6 address literal, without a port:
if strings.HasPrefix(host, "[") && strings.HasSuffix(host, "]") {
@@ -414,6 +481,8 @@ func (t *Transport) dialTLSWithContext(ctx context.Context, network, addr string
// GoAwayError is returned by the Transport when the server closes the
// TCP connection after sending a GOAWAY frame.
//
// Deprecated: GoAwayError is deprecated.
type GoAwayError struct {
LastStreamID uint32
ErrCode ErrCode
+2
View File
@@ -216,6 +216,8 @@ func (t *Transport) newUserClientConn(c net.Conn) (*ClientConn, error) {
// ClientConn is the state of a single HTTP/2 client connection to an
// HTTP/2 server.
//
// Deprecated: Use [http.ClientConn] instead.
type ClientConn struct {
cc *http.ClientConn
tconn net.Conn
+7
View File
@@ -0,0 +1,7 @@
These two packages are identical:
- net/http/internal/httpcommon
- golang.org/x/net/internal/httpcommon
The two are kept in sync manually.
Any change to one should be made in the other.
+31 -3
View File
@@ -391,6 +391,7 @@ type ServerRequestParam struct {
// ServerRequestResult is the result of NewServerRequest.
type ServerRequestResult struct {
// Various http.Request fields.
Host string
URL *url.URL
RequestURI string
Trailer map[string][]string
@@ -433,20 +434,46 @@ func NewServerRequest(rp ServerRequestParam) ServerRequestResult {
}
delete(rp.Header, "Trailer")
authority := rp.Authority
if host := rp.Header["Host"]; len(host) == 1 {
// HTTP/2 and HTTP/3 permit the Host header to be present,
// but it must match the :authority pseudo-header.
if authority == "" {
authority = host[0]
} else if host[0] != authority {
return ServerRequestResult{
InvalidReason: "authority_host_mismatch",
}
}
delete(rp.Header, "Host")
} else if len(host) > 1 {
// HTTP/1.1 rejects any request containing more than one Host header.
// HTTP/2 and HTTP/3 don't use the Host header, but reject multiple anyway.
return ServerRequestResult{
InvalidReason: "multiple_host_headers",
}
}
// "':authority' MUST NOT include the deprecated userinfo subcomponent
// for "http" or "https" schemed URIs."
// https://www.rfc-editor.org/rfc/rfc9113.html#section-8.3.1-2.3.8
if strings.IndexByte(rp.Authority, '@') != -1 && (rp.Scheme == "http" || rp.Scheme == "https") {
if strings.IndexByte(authority, '@') != -1 && (rp.Scheme == "http" || rp.Scheme == "https") {
return ServerRequestResult{
InvalidReason: "userinfo_in_authority",
}
}
if authority != "" && !httpguts.ValidHostHeader(authority) {
return ServerRequestResult{
InvalidReason: "invalid_authority",
}
}
var url_ *url.URL
var requestURI string
if rp.Method == "CONNECT" && rp.Protocol == "" {
url_ = &url.URL{Host: rp.Authority}
requestURI = rp.Authority // mimic HTTP/1 server behavior
url_ = &url.URL{Host: authority}
requestURI = authority // mimic HTTP/1 server behavior
} else {
// "[The :path] pseudo-header field MUST NOT be empty [...]"
// https://www.rfc-editor.org/rfc/rfc9113.html#section-8.3.1-2.4.2
@@ -467,6 +494,7 @@ func NewServerRequest(rp ServerRequestParam) ServerRequestResult {
}
return ServerRequestResult{
Host: authority,
URL: url_,
NeedsContinue: needsContinue,
RequestURI: requestURI,
+1 -4
View File
@@ -70,10 +70,7 @@ func log2(i int64) int {
}
func getBucket(i int64) (index int) {
index = log2(i) - 1
if index < 0 {
index = 0
}
index = max(log2(i)-1, 0)
if index >= bucketCount {
index = bucketCount - 1
}
+2 -2
View File
@@ -397,8 +397,8 @@ golang.org/x/mod/internal/lazyregexp
golang.org/x/mod/modfile
golang.org/x/mod/module
golang.org/x/mod/semver
# golang.org/x/net v0.58.0
## explicit; go 1.25.0
# golang.org/x/net v0.59.0
## explicit; go 1.26.0
golang.org/x/net/http/httpguts
golang.org/x/net/http2
golang.org/x/net/http2/hpack