| // Copyright 2026 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package http2 |
| |
| import ( |
| "context" |
| "crypto/tls" |
| "errors" |
| "io" |
| "log" |
| "mime/multipart" |
| "net" |
| "net/http/internal" |
| "net/textproto" |
| "net/url" |
| "time" |
| ) |
| |
| // Since net/http imports the http2 package, http2 cannot use any net/http types. |
| // This file contains definitions which exist to to avoid introducing a dependency cycle. |
| |
| // Variables defined in net/http and initialized by an init func in that package. |
| // |
| // NoBody and LocalAddrContextKey have concrete types in net/http, |
| // and therefore can't be moved into a common package without introducing |
| // a dependency cycle. |
| var ( |
| NoBody io.ReadCloser |
| LocalAddrContextKey any |
| ) |
| |
| var ( |
| ErrAbortHandler = internal.ErrAbortHandler |
| ErrBodyNotAllowed = internal.ErrBodyNotAllowed |
| ErrNotSupported = errors.ErrUnsupported |
| ErrSkipAltProtocol = internal.ErrSkipAltProtocol |
| ) |
| |
| // A ClientRequest is a Request used by the HTTP/2 client (Transport). |
| type ClientRequest struct { |
| Context context.Context |
| Method string |
| URL *url.URL |
| Header Header |
| Trailer Header |
| Body io.ReadCloser |
| Host string |
| GetBody func() (io.ReadCloser, error) |
| ContentLength int64 |
| Cancel <-chan struct{} |
| Close bool |
| ResTrailer *Header |
| |
| // Include the per-request stream in the ClientRequest to avoid an allocation. |
| stream clientStream |
| } |
| |
| // Clone makes a shallow copy of ClientRequest. |
| // |
| // Clone is only used in shouldRetryRequest. |
| // We can drop it if we ever get rid of or rework that function. |
| func (req *ClientRequest) Clone() *ClientRequest { |
| return &ClientRequest{ |
| Context: req.Context, |
| Method: req.Method, |
| URL: req.URL, |
| Header: req.Header, |
| Trailer: req.Trailer, |
| Body: req.Body, |
| Host: req.Host, |
| GetBody: req.GetBody, |
| ContentLength: req.ContentLength, |
| Cancel: req.Cancel, |
| Close: req.Close, |
| ResTrailer: req.ResTrailer, |
| } |
| } |
| |
| // A ClientResponse is a Request used by the HTTP/2 client (Transport). |
| type ClientResponse struct { |
| Status string // e.g. "200" |
| StatusCode int // e.g. 200 |
| ContentLength int64 |
| Uncompressed bool |
| Header Header |
| Trailer Header |
| Body io.ReadCloser |
| TLS *tls.ConnectionState |
| } |
| |
| type Header = textproto.MIMEHeader |
| |
| // TransportConfig is configuration from an http.Transport. |
| type TransportConfig interface { |
| MaxResponseHeaderBytes() int64 |
| DisableCompression() bool |
| DisableKeepAlives() bool |
| ExpectContinueTimeout() time.Duration |
| ResponseHeaderTimeout() time.Duration |
| IdleConnTimeout() time.Duration |
| HTTP2Config() Config |
| } |
| |
| // ServerConfig is configuration from an http.Server. |
| type ServerConfig interface { |
| MaxHeaderBytes() int |
| ConnState(net.Conn, ConnState) |
| DoKeepAlives() bool |
| WriteTimeout() time.Duration |
| SendPingTimeout() time.Duration |
| ErrorLog() *log.Logger |
| ReadTimeout() time.Duration |
| HTTP2Config() Config |
| DisableClientPriority() bool |
| } |
| |
| type Handler interface { |
| ServeHTTP(*ResponseWriter, *ServerRequest) |
| } |
| |
| type ResponseWriter = responseWriter |
| |
| type PushOptions struct { |
| Method string |
| Header Header |
| } |
| |
| // A ServerRequest is a Request used by the HTTP/2 server. |
| type ServerRequest struct { |
| Context context.Context |
| Proto string // e.g. "HTTP/1.0" |
| ProtoMajor int // e.g. 1 |
| ProtoMinor int // e.g. 0 |
| Method string |
| URL *url.URL |
| Header Header |
| Trailer Header |
| Body io.ReadCloser |
| Host string |
| ContentLength int64 |
| RemoteAddr string |
| RequestURI string |
| TLS *tls.ConnectionState |
| MultipartForm *multipart.Form |
| } |
| |
| // ConnState is identical to net/http.ConnState. |
| type ConnState int |
| |
| const ( |
| ConnStateNew ConnState = iota |
| ConnStateActive |
| ConnStateIdle |
| ConnStateHijacked |
| ConnStateClosed |
| ) |