...

Package http2

import "net/http/internal/http2"
Overview
Index

Overview ▾

Package http2 implements the HTTP/2 protocol.

This package is low-level and intended to be used directly by very few people. Most users will use it indirectly through the automatic use by the net/http package (from Go 1.6 and later). For use in earlier Go versions see ConfigureServer. (Transport support requires Go 1.6 or later)

See https://http2.github.io/ for more information on HTTP/2.

Index ▾

Constants
Variables
type ClientConn
    func (cc *ClientConn) CanTakeNewRequest() bool
    func (cc *ClientConn) Close() error
    func (cc *ClientConn) Ping(ctx context.Context) error
    func (cc *ClientConn) ReserveNewRequest() bool
    func (cc *ClientConn) RoundTrip(req *ClientRequest) (*ClientResponse, error)
    func (cc *ClientConn) SetDoNotReuse()
    func (cc *ClientConn) Shutdown(ctx context.Context) error
    func (cc *ClientConn) State() ClientConnState
type ClientConnState
type ClientRequest
    func (req *ClientRequest) Clone() *ClientRequest
type ClientResponse
type Config
type ConnState
type ConnectionError
    func (e ConnectionError) Error() string
type ContinuationFrame
    func (f *ContinuationFrame) HeaderBlockFragment() []byte
    func (f *ContinuationFrame) HeadersEnded() bool
type DataFrame
    func (f *DataFrame) Data() []byte
    func (f *DataFrame) StreamEnded() bool
type ErrCode
    func (e ErrCode) String() string
type Flags
    func (f Flags) Has(v Flags) bool
type Frame
type FrameHeader
    func ReadFrameHeader(r io.Reader) (FrameHeader, error)
    func (h FrameHeader) Header() FrameHeader
    func (h FrameHeader) String() string
type FrameType
    func (t FrameType) String() string
type FrameWriteRequest
    func (wr FrameWriteRequest) Consume(n int32) (FrameWriteRequest, FrameWriteRequest, int)
    func (wr FrameWriteRequest) DataSize() int
    func (wr FrameWriteRequest) StreamID() uint32
    func (wr FrameWriteRequest) String() string
type Framer
    func NewFramer(w io.Writer, r io.Reader) *Framer
    func (fr *Framer) ErrorDetail() error
    func (fr *Framer) ReadFrame() (Frame, error)
    func (fr *Framer) ReadFrameForHeader(fh FrameHeader) (Frame, error)
    func (fr *Framer) ReadFrameHeader() (FrameHeader, error)
    func (fr *Framer) SetMaxReadFrameSize(v uint32)
    func (fr *Framer) SetReuseFrames()
    func (f *Framer) WriteContinuation(streamID uint32, endHeaders bool, headerBlockFragment []byte) error
    func (f *Framer) WriteData(streamID uint32, endStream bool, data []byte) error
    func (f *Framer) WriteDataPadded(streamID uint32, endStream bool, data, pad []byte) error
    func (f *Framer) WriteGoAway(maxStreamID uint32, code ErrCode, debugData []byte) error
    func (f *Framer) WriteHeaders(p HeadersFrameParam) error
    func (f *Framer) WritePing(ack bool, data [8]byte) error
    func (f *Framer) WritePriority(streamID uint32, p PriorityParam) error
    func (f *Framer) WritePriorityUpdate(streamID uint32, priority string) error
    func (f *Framer) WritePushPromise(p PushPromiseParam) error
    func (f *Framer) WriteRSTStream(streamID uint32, code ErrCode) error
    func (f *Framer) WriteRawFrame(t FrameType, flags Flags, streamID uint32, payload []byte) error
    func (f *Framer) WriteSettings(settings ...Setting) error
    func (f *Framer) WriteSettingsAck() error
    func (f *Framer) WriteWindowUpdate(streamID, incr uint32) error
type GoAwayError
    func (e GoAwayError) Error() string
type GoAwayFrame
    func (f *GoAwayFrame) DebugData() []byte
type Handler
type Header
type HeadersFrame
    func (f *HeadersFrame) HasPriority() bool
    func (f *HeadersFrame) HeaderBlockFragment() []byte
    func (f *HeadersFrame) HeadersEnded() bool
    func (f *HeadersFrame) StreamEnded() bool
type HeadersFrameParam
type MetaHeadersFrame
    func (mh *MetaHeadersFrame) PseudoFields() []hpack.HeaderField
    func (mh *MetaHeadersFrame) PseudoValue(pseudo string) string
    func (mh *MetaHeadersFrame) RegularFields() []hpack.HeaderField
type NetHTTPClientConn
    func (cc NetHTTPClientConn) Available() int
    func (cc NetHTTPClientConn) Close() error
    func (cc NetHTTPClientConn) Err() error
    func (cc NetHTTPClientConn) InFlight() int
    func (cc NetHTTPClientConn) Ping(ctx context.Context) error
    func (cc NetHTTPClientConn) Release()
    func (cc NetHTTPClientConn) Reserve() error
    func (cc NetHTTPClientConn) RoundTrip(req *ClientRequest) (*ClientResponse, error)
type OpenStreamOptions
type PingFrame
    func (f *PingFrame) IsAck() bool
type PriorityFrame
type PriorityParam
    func (p PriorityParam) IsZero() bool
type PriorityUpdateFrame
type PushOptions
type PushPromiseFrame
    func (f *PushPromiseFrame) HeaderBlockFragment() []byte
    func (f *PushPromiseFrame) HeadersEnded() bool
type PushPromiseParam
type RSTStreamFrame
type ResponseWriter
type RoundTripOpt
type ServeConnOpts
type Server
    func (s *Server) Configure(conf ServerConfig, tcfg *tls.Config) error
    func (s *Server) GracefulShutdown()
    func (s *Server) ServeConn(c net.Conn, opts *ServeConnOpts)
type ServerConfig
type ServerRequest
type Setting
    func (s Setting) String() string
    func (s Setting) Valid() error
type SettingID
    func (s SettingID) String() string
type SettingsFrame
    func (f *SettingsFrame) ForeachSetting(fn func(Setting) error) error
    func (f *SettingsFrame) HasDuplicates() bool
    func (f *SettingsFrame) IsAck() bool
    func (f *SettingsFrame) NumSettings() int
    func (f *SettingsFrame) Setting(i int) Setting
    func (f *SettingsFrame) Value(id SettingID) (v uint32, ok bool)
type StreamError
    func (e StreamError) As(target any) bool
    func (e StreamError) Error() string
type Transport
    func NewTransport(t1 TransportConfig) *Transport
    func (t *Transport) AddConn(scheme, authority string, c net.Conn) error
    func (t *Transport) CloseIdleConnections()
    func (t *Transport) IdleConnStrsForTesting() []string
    func (t *Transport) NewClientConn(c net.Conn, internalStateHook func()) (NetHTTPClientConn, error)
    func (t *Transport) RoundTrip(req *ClientRequest) (*ClientResponse, error)
    func (t *Transport) RoundTripOpt(req *ClientRequest, opt RoundTripOpt) (*ClientResponse, error)
type TransportConfig
type UnknownFrame
    func (f *UnknownFrame) Payload() []byte
type WindowUpdateFrame
type WriteScheduler

Package files

api.go ascii.go ciphers.go client_conn_pool.go config.go databuffer.go errors.go flow.go frame.go gotrack.go http2.go pipe.go server.go transport.go write.go writesched.go writesched_priority_rfc9218.go writesched_roundrobin.go

Constants

const (
    // ClientPreface is the string that must be sent by new
    // connections from clients.
    ClientPreface = "PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n"

    // NextProtoTLS is the NPN/ALPN protocol negotiated during
    // HTTP/2's TLS setup.
    NextProtoTLS = "h2"
)
const DefaultMaxHeaderBytes = 1 << 20 // keep this in sync with net/http
const TimeFormat = "Mon, 02 Jan 2006 15:04:05 GMT" // keep in sync with net/http

TrailerPrefix is a magic prefix for ResponseWriter.Header map keys that, if present, signals that the map entry is actually for the response trailers, and not the response headers. The prefix is stripped after the ServeHTTP call finishes and the values are sent in the trailers.

This mechanism is intended only for trailers that are not known prior to the headers being written. If the set of trailers is fixed or known before the header is written, the normal Go trailers mechanism is preferred:

https://golang.org/pkg/net/http/#ResponseWriter
https://golang.org/pkg/net/http/#example_ResponseWriter_trailers
const TrailerPrefix = "Trailer:"

Variables

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
)
var (
    NewConnContextKey         = new("NewConnContextKey")
    ConnectionStateContextKey = new("ConnectionStateContextKey")
)

Push errors.

var (
    ErrRecursivePush    = errors.New("http2: recursive push not allowed")
    ErrPushLimitReached = errors.New("http2: push would exceed peer's SETTINGS_MAX_CONCURRENT_STREAMS")
)
var DebugGoroutines = os.Getenv("DEBUG_HTTP2_GOROUTINES") == "1"

ErrFrameTooLarge is returned from Framer.ReadFrame when the peer sends a frame that is larger than declared with SetMaxReadFrameSize.

var ErrFrameTooLarge = errors.New("http2: frame too large")
var ErrNoCachedConn error = noCachedConnError{}
var (
    VerboseLogs bool
)

type ClientConn

ClientConn is the state of a single HTTP/2 client connection to an HTTP/2 server.

type ClientConn struct {
    // contains filtered or unexported fields
}

func (*ClientConn) CanTakeNewRequest

func (cc *ClientConn) CanTakeNewRequest() bool

CanTakeNewRequest reports whether the connection can take a new request, meaning it has not been closed or received or sent a GOAWAY.

If the caller is going to immediately make a new request on this connection, use ReserveNewRequest instead.

func (*ClientConn) Close

func (cc *ClientConn) Close() error

Close closes the client connection immediately.

In-flight requests are interrupted. For a graceful shutdown, use Shutdown instead.

func (*ClientConn) Ping

func (cc *ClientConn) Ping(ctx context.Context) error

Ping sends a PING frame to the server and waits for the ack.

func (*ClientConn) ReserveNewRequest

func (cc *ClientConn) ReserveNewRequest() bool

ReserveNewRequest is like CanTakeNewRequest but also reserves a concurrent stream in cc. The reservation is decremented on the next call to RoundTrip.

func (*ClientConn) RoundTrip

func (cc *ClientConn) RoundTrip(req *ClientRequest) (*ClientResponse, error)

func (*ClientConn) SetDoNotReuse

func (cc *ClientConn) SetDoNotReuse()

SetDoNotReuse marks cc as not reusable for future HTTP requests.

func (*ClientConn) Shutdown

func (cc *ClientConn) Shutdown(ctx context.Context) error

Shutdown gracefully closes the client connection, waiting for running streams to complete.

func (*ClientConn) State

func (cc *ClientConn) State() ClientConnState

State returns a snapshot of cc's state.

type ClientConnState

ClientConnState describes the state of a ClientConn.

type ClientConnState struct {
    // Closed is whether the connection is closed.
    Closed bool

    // Closing is whether the connection is in the process of
    // closing. It may be closing due to shutdown, being a
    // single-use connection, being marked as DoNotReuse, or
    // having received a GOAWAY frame.
    Closing bool

    // StreamsActive is how many streams are active.
    StreamsActive int

    // StreamsReserved is how many streams have been reserved via
    // ClientConn.ReserveNewRequest.
    StreamsReserved int

    // StreamsPending is how many requests have been sent in excess
    // of the peer's advertised MaxConcurrentStreams setting and
    // are waiting for other streams to complete.
    StreamsPending int

    // MaxConcurrentStreams is how many concurrent streams the
    // peer advertised as acceptable. Zero means no SETTINGS
    // frame has been received yet.
    MaxConcurrentStreams uint32

    // LastIdle, if non-zero, is when the connection last
    // transitioned to idle state.
    LastIdle time.Time
}

type ClientRequest

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
    // contains filtered or unexported fields
}

func (*ClientRequest) Clone

func (req *ClientRequest) Clone() *ClientRequest

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.

type ClientResponse

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 Config

Config must be kept in sync with net/http.HTTP2Config.

type Config struct {
    MaxConcurrentStreams          int
    StrictMaxConcurrentRequests   bool
    MaxDecoderHeaderTableSize     int
    MaxEncoderHeaderTableSize     int
    MaxReadFrameSize              int
    MaxReceiveBufferPerConnection int
    MaxReceiveBufferPerStream     int
    SendPingTimeout               time.Duration
    PingTimeout                   time.Duration
    WriteByteTimeout              time.Duration
    PermitProhibitedCipherSuites  bool
    CountError                    func(errType string)
}

type ConnState

ConnState is identical to net/http.ConnState.

type ConnState int
const (
    ConnStateNew ConnState = iota
    ConnStateActive
    ConnStateIdle
    ConnStateHijacked
    ConnStateClosed
)

type ConnectionError

ConnectionError is an error that results in the termination of the entire connection.

type ConnectionError ErrCode

func (ConnectionError) Error

func (e ConnectionError) Error() string

type ContinuationFrame

A ContinuationFrame is used to continue a sequence of header block fragments. See https://httpwg.org/specs/rfc7540.html#rfc.section.6.10

type ContinuationFrame struct {
    FrameHeader
    // contains filtered or unexported fields
}

func (*ContinuationFrame) HeaderBlockFragment

func (f *ContinuationFrame) HeaderBlockFragment() []byte

func (*ContinuationFrame) HeadersEnded

func (f *ContinuationFrame) HeadersEnded() bool

type DataFrame

A DataFrame conveys arbitrary, variable-length sequences of octets associated with a stream. See https://httpwg.org/specs/rfc7540.html#rfc.section.6.1

type DataFrame struct {
    FrameHeader
    // contains filtered or unexported fields
}

func (*DataFrame) Data

func (f *DataFrame) Data() []byte

Data returns the frame's data octets, not including any padding size byte or padding suffix bytes. The caller must not retain the returned memory past the next call to ReadFrame.

func (*DataFrame) StreamEnded

func (f *DataFrame) StreamEnded() bool

type ErrCode

An ErrCode is an unsigned 32-bit error code as defined in the HTTP/2 spec.

type ErrCode uint32
const (
    ErrCodeNo                 ErrCode = 0x0
    ErrCodeProtocol           ErrCode = 0x1
    ErrCodeInternal           ErrCode = 0x2
    ErrCodeFlowControl        ErrCode = 0x3
    ErrCodeSettingsTimeout    ErrCode = 0x4
    ErrCodeStreamClosed       ErrCode = 0x5
    ErrCodeFrameSize          ErrCode = 0x6
    ErrCodeRefusedStream      ErrCode = 0x7
    ErrCodeCancel             ErrCode = 0x8
    ErrCodeCompression        ErrCode = 0x9
    ErrCodeConnect            ErrCode = 0xa
    ErrCodeEnhanceYourCalm    ErrCode = 0xb
    ErrCodeInadequateSecurity ErrCode = 0xc
    ErrCodeHTTP11Required     ErrCode = 0xd
)

func (ErrCode) String

func (e ErrCode) String() string

type Flags

Flags is a bitmask of HTTP/2 flags. The meaning of flags varies depending on the frame type.

type Flags uint8

Frame-specific FrameHeader flag bits.

const (
    // Data Frame
    FlagDataEndStream Flags = 0x1
    FlagDataPadded    Flags = 0x8

    // Headers Frame
    FlagHeadersEndStream  Flags = 0x1
    FlagHeadersEndHeaders Flags = 0x4
    FlagHeadersPadded     Flags = 0x8
    FlagHeadersPriority   Flags = 0x20

    // Settings Frame
    FlagSettingsAck Flags = 0x1

    // Ping Frame
    FlagPingAck Flags = 0x1

    // Continuation Frame
    FlagContinuationEndHeaders Flags = 0x4

    FlagPushPromiseEndHeaders Flags = 0x4
    FlagPushPromisePadded     Flags = 0x8
)

func (Flags) Has

func (f Flags) Has(v Flags) bool

Has reports whether f contains all (0 or more) flags in v.

type Frame

A Frame is the base interface implemented by all frame types. Callers will generally type-assert the specific frame type: *HeadersFrame, *SettingsFrame, *WindowUpdateFrame, etc.

Frames are only valid until the next call to Framer.ReadFrame.

type Frame interface {
    Header() FrameHeader
    // contains filtered or unexported methods
}

type FrameHeader

A FrameHeader is the 9 byte header of all HTTP/2 frames.

See https://httpwg.org/specs/rfc7540.html#FrameHeader

type FrameHeader struct {

    // Type is the 1 byte frame type. There are ten standard frame
    // types, but extension frame types may be written by WriteRawFrame
    // and will be returned by ReadFrame (as UnknownFrame).
    Type FrameType

    // Flags are the 1 byte of 8 potential bit flags per frame.
    // They are specific to the frame type.
    Flags Flags

    // Length is the length of the frame, not including the 9 byte header.
    // The maximum size is one byte less than 16MB (uint24), but only
    // frames up to 16KB are allowed without peer agreement.
    Length uint32

    // StreamID is which stream this frame is for. Certain frames
    // are not stream-specific, in which case this field is 0.
    StreamID uint32
    // contains filtered or unexported fields
}

func ReadFrameHeader

func ReadFrameHeader(r io.Reader) (FrameHeader, error)

ReadFrameHeader reads 9 bytes from r and returns a FrameHeader. Most users should use Framer.ReadFrame instead.

func (FrameHeader) Header

func (h FrameHeader) Header() FrameHeader

Header returns h. It exists so FrameHeaders can be embedded in other specific frame types and implement the Frame interface.

func (FrameHeader) String

func (h FrameHeader) String() string

type FrameType

A FrameType is a registered frame type as defined in https://httpwg.org/specs/rfc7540.html#rfc.section.11.2 and other future RFCs.

type FrameType uint8
const (
    FrameData           FrameType = 0x0
    FrameHeaders        FrameType = 0x1
    FramePriority       FrameType = 0x2
    FrameRSTStream      FrameType = 0x3
    FrameSettings       FrameType = 0x4
    FramePushPromise    FrameType = 0x5
    FramePing           FrameType = 0x6
    FrameGoAway         FrameType = 0x7
    FrameWindowUpdate   FrameType = 0x8
    FrameContinuation   FrameType = 0x9
    FramePriorityUpdate FrameType = 0x10
)

func (FrameType) String

func (t FrameType) String() string

type FrameWriteRequest

FrameWriteRequest is a request to write a frame.

type FrameWriteRequest struct {
    // contains filtered or unexported fields
}

func (FrameWriteRequest) Consume

func (wr FrameWriteRequest) Consume(n int32) (FrameWriteRequest, FrameWriteRequest, int)

Consume consumes min(n, available) bytes from this frame, where available is the number of flow control bytes available on the stream. Consume returns 0, 1, or 2 frames, where the integer return value gives the number of frames returned.

If flow control prevents consuming any bytes, this returns (_, _, 0). If the entire frame was consumed, this returns (wr, _, 1). Otherwise, this returns (consumed, rest, 2), where 'consumed' contains the consumed bytes and 'rest' contains the remaining bytes. The consumed bytes are deducted from the underlying stream's flow control budget.

func (FrameWriteRequest) DataSize

func (wr FrameWriteRequest) DataSize() int

DataSize returns the number of flow control bytes that must be consumed to write this entire frame. This is 0 for non-DATA frames.

func (FrameWriteRequest) StreamID

func (wr FrameWriteRequest) StreamID() uint32

StreamID returns the id of the stream this frame will be written to. 0 is used for non-stream frames such as PING and SETTINGS.

func (FrameWriteRequest) String

func (wr FrameWriteRequest) String() string

String is for debugging only.

type Framer

A Framer reads and writes Frames.

type Framer struct {

    // AllowIllegalWrites permits the Framer's Write methods to
    // write frames that do not conform to the HTTP/2 spec. This
    // permits using the Framer to test other HTTP/2
    // implementations' conformance to the spec.
    // If false, the Write methods will prefer to return an error
    // rather than comply.
    AllowIllegalWrites bool

    // AllowIllegalReads permits the Framer's ReadFrame method
    // to return non-compliant frames or frame orders.
    // This is for testing and permits using the Framer to test
    // other HTTP/2 implementations' conformance to the spec.
    // It is not compatible with ReadMetaHeaders.
    AllowIllegalReads bool

    // ReadMetaHeaders if non-nil causes ReadFrame to merge
    // HEADERS and CONTINUATION frames together and return
    // MetaHeadersFrame instead.
    ReadMetaHeaders *hpack.Decoder

    // MaxHeaderListSize is the http2 MAX_HEADER_LIST_SIZE.
    // It's used only if ReadMetaHeaders is set; 0 means a sane default
    // (currently 16MB)
    // If the limit is hit, MetaHeadersFrame.Truncated is set true.
    MaxHeaderListSize uint32

    // MaxHeaderValueCount is the maximum permitted number of
    // header values.
    // It's used only if ReadMetaHeaders is set; 0 means no limit.
    // If the limit is hit, MetaHeadersFrame.Truncated is set true.
    MaxHeaderValueCount int
    // contains filtered or unexported fields
}

func NewFramer

func NewFramer(w io.Writer, r io.Reader) *Framer

NewFramer returns a Framer that writes frames to w and reads them from r.

func (*Framer) ErrorDetail

func (fr *Framer) ErrorDetail() error

ErrorDetail returns a more detailed error of the last error returned by Framer.ReadFrame. For instance, if ReadFrame returns a StreamError with code PROTOCOL_ERROR, ErrorDetail will say exactly what was invalid. ErrorDetail is not guaranteed to return a non-nil value and like the rest of the http2 package, its return value is not protected by an API compatibility promise. ErrorDetail is reset after the next call to ReadFrame.

func (*Framer) ReadFrame

func (fr *Framer) ReadFrame() (Frame, error)

ReadFrame reads a single frame. The returned Frame is only valid until the next call to ReadFrame or ReadFrameBodyForHeader.

If the frame is larger than previously set with SetMaxReadFrameSize, the returned error is ErrFrameTooLarge. Other errors may be of type ConnectionError, StreamError, or anything else from the underlying reader.

If ReadFrame returns an error and a non-nil Frame, the Frame's StreamID indicates the stream responsible for the error.

func (*Framer) ReadFrameForHeader

func (fr *Framer) ReadFrameForHeader(fh FrameHeader) (Frame, error)

ReadFrameForHeader reads the payload for the frame with the given FrameHeader.

It behaves identically to ReadFrame, other than not checking the maximum frame size.

func (*Framer) ReadFrameHeader

func (fr *Framer) ReadFrameHeader() (FrameHeader, error)

ReadFrameHeader reads the header of the next frame. It reads the 9-byte fixed frame header, and does not read any portion of the frame payload. The caller is responsible for consuming the payload, either with ReadFrameForHeader or directly from the Framer's io.Reader.

If the frame is larger than previously set with SetMaxReadFrameSize, it returns the frame header and ErrFrameTooLarge.

If the returned FrameHeader.StreamID is non-zero, it indicates the stream responsible for the error.

func (*Framer) SetMaxReadFrameSize

func (fr *Framer) SetMaxReadFrameSize(v uint32)

SetMaxReadFrameSize sets the maximum size of a frame that will be read by a subsequent call to ReadFrame. It is the caller's responsibility to advertise this limit with a SETTINGS frame.

func (*Framer) SetReuseFrames

func (fr *Framer) SetReuseFrames()

SetReuseFrames allows the Framer to reuse Frames. If called on a Framer, Frames returned by calls to ReadFrame are only valid until the next call to ReadFrame.

func (*Framer) WriteContinuation

func (f *Framer) WriteContinuation(streamID uint32, endHeaders bool, headerBlockFragment []byte) error

WriteContinuation writes a CONTINUATION frame.

It will perform exactly one Write to the underlying Writer. It is the caller's responsibility to not call other Write methods concurrently.

func (*Framer) WriteData

func (f *Framer) WriteData(streamID uint32, endStream bool, data []byte) error

WriteData writes a DATA frame.

It will perform exactly one Write to the underlying Writer. It is the caller's responsibility not to violate the maximum frame size and to not call other Write methods concurrently.

func (*Framer) WriteDataPadded

func (f *Framer) WriteDataPadded(streamID uint32, endStream bool, data, pad []byte) error

WriteDataPadded writes a DATA frame with optional padding.

If pad is nil, the padding bit is not sent. The length of pad must not exceed 255 bytes. The bytes of pad must all be zero, unless f.AllowIllegalWrites is set.

It will perform exactly one Write to the underlying Writer. It is the caller's responsibility not to violate the maximum frame size and to not call other Write methods concurrently.

func (*Framer) WriteGoAway

func (f *Framer) WriteGoAway(maxStreamID uint32, code ErrCode, debugData []byte) error

func (*Framer) WriteHeaders

func (f *Framer) WriteHeaders(p HeadersFrameParam) error

WriteHeaders writes a single HEADERS frame.

This is a low-level header writing method. Encoding headers and splitting them into any necessary CONTINUATION frames is handled elsewhere.

It will perform exactly one Write to the underlying Writer. It is the caller's responsibility to not call other Write methods concurrently.

func (*Framer) WritePing

func (f *Framer) WritePing(ack bool, data [8]byte) error

func (*Framer) WritePriority

func (f *Framer) WritePriority(streamID uint32, p PriorityParam) error

WritePriority writes a PRIORITY frame.

It will perform exactly one Write to the underlying Writer. It is the caller's responsibility to not call other Write methods concurrently.

func (*Framer) WritePriorityUpdate

func (f *Framer) WritePriorityUpdate(streamID uint32, priority string) error

WritePriorityUpdate writes a PRIORITY_UPDATE frame.

It will perform exactly one Write to the underlying Writer. It is the caller's responsibility to not call other Write methods concurrently.

func (*Framer) WritePushPromise

func (f *Framer) WritePushPromise(p PushPromiseParam) error

WritePushPromise writes a single PushPromise Frame.

As with Header Frames, This is the low level call for writing individual frames. Continuation frames are handled elsewhere.

It will perform exactly one Write to the underlying Writer. It is the caller's responsibility to not call other Write methods concurrently.

func (*Framer) WriteRSTStream

func (f *Framer) WriteRSTStream(streamID uint32, code ErrCode) error

WriteRSTStream writes a RST_STREAM frame.

It will perform exactly one Write to the underlying Writer. It is the caller's responsibility to not call other Write methods concurrently.

func (*Framer) WriteRawFrame

func (f *Framer) WriteRawFrame(t FrameType, flags Flags, streamID uint32, payload []byte) error

WriteRawFrame writes a raw frame. This can be used to write extension frames unknown to this package.

func (*Framer) WriteSettings

func (f *Framer) WriteSettings(settings ...Setting) error

WriteSettings writes a SETTINGS frame with zero or more settings specified and the ACK bit not set.

It will perform exactly one Write to the underlying Writer. It is the caller's responsibility to not call other Write methods concurrently.

func (*Framer) WriteSettingsAck

func (f *Framer) WriteSettingsAck() error

WriteSettingsAck writes an empty SETTINGS frame with the ACK bit set.

It will perform exactly one Write to the underlying Writer. It is the caller's responsibility to not call other Write methods concurrently.

func (*Framer) WriteWindowUpdate

func (f *Framer) WriteWindowUpdate(streamID, incr uint32) error

WriteWindowUpdate writes a WINDOW_UPDATE frame. The increment value must be between 1 and 2,147,483,647, inclusive. If the Stream ID is zero, the window update applies to the connection as a whole.

type GoAwayError

GoAwayError is returned by the Transport when the server closes the TCP connection after sending a GOAWAY frame.

type GoAwayError struct {
    LastStreamID uint32
    ErrCode      ErrCode
    DebugData    string
}

func (GoAwayError) Error

func (e GoAwayError) Error() string

type GoAwayFrame

A GoAwayFrame informs the remote peer to stop creating streams on this connection. See https://httpwg.org/specs/rfc7540.html#rfc.section.6.8

type GoAwayFrame struct {
    FrameHeader
    LastStreamID uint32
    ErrCode      ErrCode
    // contains filtered or unexported fields
}

func (*GoAwayFrame) DebugData

func (f *GoAwayFrame) DebugData() []byte

DebugData returns any debug data in the GOAWAY frame. Its contents are not defined. The caller must not retain the returned memory past the next call to ReadFrame.

type Handler

type Handler interface {
    ServeHTTP(*ResponseWriter, *ServerRequest)
}
type Header = textproto.MIMEHeader

type HeadersFrame

A HeadersFrame is used to open a stream and additionally carries a header block fragment.

type HeadersFrame struct {
    FrameHeader

    // Priority is set if FlagHeadersPriority is set in the FrameHeader.
    Priority PriorityParam
    // contains filtered or unexported fields
}

func (*HeadersFrame) HasPriority

func (f *HeadersFrame) HasPriority() bool

func (*HeadersFrame) HeaderBlockFragment

func (f *HeadersFrame) HeaderBlockFragment() []byte

func (*HeadersFrame) HeadersEnded

func (f *HeadersFrame) HeadersEnded() bool

func (*HeadersFrame) StreamEnded

func (f *HeadersFrame) StreamEnded() bool

type HeadersFrameParam

HeadersFrameParam are the parameters for writing a HEADERS frame.

type HeadersFrameParam struct {
    // StreamID is the required Stream ID to initiate.
    StreamID uint32
    // BlockFragment is part (or all) of a Header Block.
    BlockFragment []byte

    // EndStream indicates that the header block is the last that
    // the endpoint will send for the identified stream. Setting
    // this flag causes the stream to enter one of "half closed"
    // states.
    EndStream bool

    // EndHeaders indicates that this frame contains an entire
    // header block and is not followed by any
    // CONTINUATION frames.
    EndHeaders bool

    // PadLength is the optional number of bytes of zeros to add
    // to this frame.
    PadLength uint8

    // Priority, if non-zero, includes stream priority information
    // in the HEADER frame.
    Priority PriorityParam
}

type MetaHeadersFrame

A MetaHeadersFrame is the representation of one HEADERS frame and zero or more contiguous CONTINUATION frames and the decoding of their HPACK-encoded contents.

This type of frame does not appear on the wire and is only returned by the Framer when Framer.ReadMetaHeaders is set.

type MetaHeadersFrame struct {
    *HeadersFrame

    // Fields are the fields contained in the HEADERS and
    // CONTINUATION frames. The underlying slice is owned by the
    // Framer and must not be retained after the next call to
    // ReadFrame.
    //
    // Fields are guaranteed to be in the correct http2 order and
    // not have unknown pseudo header fields or invalid header
    // field names or values. Required pseudo header fields may be
    // missing, however. Use the MetaHeadersFrame.Pseudo accessor
    // method access pseudo headers.
    Fields []hpack.HeaderField

    // Truncated is whether the max header list size limit was hit
    // and Fields is incomplete. The hpack decoder state is still
    // valid, however.
    Truncated bool
}

func (*MetaHeadersFrame) PseudoFields

func (mh *MetaHeadersFrame) PseudoFields() []hpack.HeaderField

PseudoFields returns the pseudo header fields of mh. The caller does not own the returned slice.

func (*MetaHeadersFrame) PseudoValue

func (mh *MetaHeadersFrame) PseudoValue(pseudo string) string

PseudoValue returns the given pseudo header field's value. The provided pseudo field should not contain the leading colon.

func (*MetaHeadersFrame) RegularFields

func (mh *MetaHeadersFrame) RegularFields() []hpack.HeaderField

RegularFields returns the regular (non-pseudo) header fields of mh. The caller does not own the returned slice.

type NetHTTPClientConn

netHTTPClientConn wraps ClientConn and implements the interface net/http expects from the RoundTripper returned by NewClientConn.

type NetHTTPClientConn struct {
    // contains filtered or unexported fields
}

func (NetHTTPClientConn) Available

func (cc NetHTTPClientConn) Available() int

func (NetHTTPClientConn) Close

func (cc NetHTTPClientConn) Close() error

func (NetHTTPClientConn) Err

func (cc NetHTTPClientConn) Err() error

func (NetHTTPClientConn) InFlight

func (cc NetHTTPClientConn) InFlight() int

func (NetHTTPClientConn) Ping

func (cc NetHTTPClientConn) Ping(ctx context.Context) error

func (NetHTTPClientConn) Release

func (cc NetHTTPClientConn) Release()

func (NetHTTPClientConn) Reserve

func (cc NetHTTPClientConn) Reserve() error

func (NetHTTPClientConn) RoundTrip

func (cc NetHTTPClientConn) RoundTrip(req *ClientRequest) (*ClientResponse, error)

type OpenStreamOptions

OpenStreamOptions specifies extra options for WriteScheduler.OpenStream.

type OpenStreamOptions struct {
    // PusherID is zero if the stream was initiated by the client. Otherwise,
    // PusherID names the stream that pushed the newly opened stream.
    PusherID uint32
    // contains filtered or unexported fields
}

type PingFrame

A PingFrame is a mechanism for measuring a minimal round trip time from the sender, as well as determining whether an idle connection is still functional. See https://httpwg.org/specs/rfc7540.html#rfc.section.6.7

type PingFrame struct {
    FrameHeader
    Data [8]byte
}

func (*PingFrame) IsAck

func (f *PingFrame) IsAck() bool

type PriorityFrame

A PriorityFrame specifies the sender-advised priority of a stream. See https://httpwg.org/specs/rfc7540.html#rfc.section.6.3

type PriorityFrame struct {
    FrameHeader
    PriorityParam
}

type PriorityParam

PriorityParam are the stream prioritization parameters.

type PriorityParam struct {
    // StreamDep is a 31-bit stream identifier for the
    // stream that this stream depends on. Zero means no
    // dependency.
    StreamDep uint32

    // Exclusive is whether the dependency is exclusive.
    Exclusive bool

    // Weight is the stream's zero-indexed weight. It should be
    // set together with StreamDep, or neither should be set. Per
    // the spec, "Add one to the value to obtain a weight between
    // 1 and 256."
    Weight uint8
    // contains filtered or unexported fields
}

func (PriorityParam) IsZero

func (p PriorityParam) IsZero() bool

type PriorityUpdateFrame

PriorityUpdateFrame is a PRIORITY_UPDATE frame as described in https://www.rfc-editor.org/rfc/rfc9218.html#name-the-priority_update-frame.

type PriorityUpdateFrame struct {
    FrameHeader
    Priority            string
    PrioritizedStreamID uint32
}

type PushOptions

type PushOptions struct {
    Method string
    Header Header
}

type PushPromiseFrame

A PushPromiseFrame is used to initiate a server stream. See https://httpwg.org/specs/rfc7540.html#rfc.section.6.6

type PushPromiseFrame struct {
    FrameHeader
    PromiseID uint32
    // contains filtered or unexported fields
}

func (*PushPromiseFrame) HeaderBlockFragment

func (f *PushPromiseFrame) HeaderBlockFragment() []byte

func (*PushPromiseFrame) HeadersEnded

func (f *PushPromiseFrame) HeadersEnded() bool

type PushPromiseParam

PushPromiseParam are the parameters for writing a PUSH_PROMISE frame.

type PushPromiseParam struct {
    // StreamID is the required Stream ID to initiate.
    StreamID uint32

    // PromiseID is the required Stream ID which this
    // Push Promises
    PromiseID uint32

    // BlockFragment is part (or all) of a Header Block.
    BlockFragment []byte

    // EndHeaders indicates that this frame contains an entire
    // header block and is not followed by any
    // CONTINUATION frames.
    EndHeaders bool

    // PadLength is the optional number of bytes of zeros to add
    // to this frame.
    PadLength uint8
}

type RSTStreamFrame

A RSTStreamFrame allows for abnormal termination of a stream. See https://httpwg.org/specs/rfc7540.html#rfc.section.6.4

type RSTStreamFrame struct {
    FrameHeader
    ErrCode ErrCode
}

type ResponseWriter

type ResponseWriter = responseWriter

type RoundTripOpt

RoundTripOpt are options for the Transport.RoundTripOpt method.

type RoundTripOpt struct {
    // OnlyCachedConn controls whether RoundTripOpt may
    // create a new TCP connection. If set true and
    // no cached connection is available, RoundTripOpt
    // will return ErrNoCachedConn.
    OnlyCachedConn bool
}

type ServeConnOpts

ServeConnOpts are options for the Server.ServeConn method.

type ServeConnOpts struct {
    // Context is the base context to use.
    // If nil, context.Background is used.
    Context context.Context

    // BaseConfig optionally sets the base configuration
    // for values. If nil, defaults are used.
    BaseConfig ServerConfig

    // Handler specifies which handler to use for processing
    // requests. If nil, BaseConfig.Handler is used. If BaseConfig
    // or BaseConfig.Handler is nil, http.DefaultServeMux is used.
    Handler Handler

    // Settings is the decoded contents of the HTTP2-Settings header
    // in an h2c upgrade request.
    Settings []byte

    UpgradeRequest *ServerRequest

    // SawClientPreface is set if the HTTP/2 connection preface
    // has already been read from the connection.
    SawClientPreface bool
}

type Server

Server is an HTTP/2 server.

type Server struct {
    // contains filtered or unexported fields
}

func (*Server) Configure

func (s *Server) Configure(conf ServerConfig, tcfg *tls.Config) error

func (*Server) GracefulShutdown

func (s *Server) GracefulShutdown()

func (*Server) ServeConn

func (s *Server) ServeConn(c net.Conn, opts *ServeConnOpts)

ServeConn serves HTTP/2 requests on the provided connection and blocks until the connection is no longer readable.

ServeConn starts speaking HTTP/2 assuming that c has not had any reads or writes. It writes its initial settings frame and expects to be able to read the preface and settings frame from the client. If c has a ConnectionState method like a *tls.Conn, the ConnectionState is used to verify the TLS ciphersuite and to set the Request.TLS field in Handlers.

ServeConn does not support h2c by itself. Any h2c support must be implemented in terms of providing a suitably-behaving net.Conn.

The opts parameter is optional. If nil, default values are used.

type ServerConfig

ServerConfig is configuration from an http.Server.

type ServerConfig interface {
    MaxHeaderBytes() int
    MaxHeaderValueCount() int
    ConnState(net.Conn, ConnState)
    DoKeepAlives() bool
    WriteTimeout() time.Duration
    SendPingTimeout() time.Duration
    ErrorLog() *log.Logger
    ReadTimeout() time.Duration
    HTTP2Config() Config
    DisableClientPriority() bool
    IdleTimeout() time.Duration
}

type ServerRequest

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
}

type Setting

Setting is a setting parameter: which setting it is, and its value.

type Setting struct {
    // ID is which setting is being set.
    // See https://httpwg.org/specs/rfc7540.html#SettingFormat
    ID SettingID

    // Val is the value.
    Val uint32
}

func (Setting) String

func (s Setting) String() string

func (Setting) Valid

func (s Setting) Valid() error

Valid reports whether the setting is valid.

type SettingID

A SettingID is an HTTP/2 setting as defined in https://httpwg.org/specs/rfc7540.html#iana-settings

type SettingID uint16
const (
    SettingHeaderTableSize       SettingID = 0x1
    SettingEnablePush            SettingID = 0x2
    SettingMaxConcurrentStreams  SettingID = 0x3
    SettingInitialWindowSize     SettingID = 0x4
    SettingMaxFrameSize          SettingID = 0x5
    SettingMaxHeaderListSize     SettingID = 0x6
    SettingEnableConnectProtocol SettingID = 0x8
    SettingNoRFC7540Priorities   SettingID = 0x9
)

func (SettingID) String

func (s SettingID) String() string

type SettingsFrame

A SettingsFrame conveys configuration parameters that affect how endpoints communicate, such as preferences and constraints on peer behavior.

See https://httpwg.org/specs/rfc7540.html#SETTINGS

type SettingsFrame struct {
    FrameHeader
    // contains filtered or unexported fields
}

func (*SettingsFrame) ForeachSetting

func (f *SettingsFrame) ForeachSetting(fn func(Setting) error) error

ForeachSetting runs fn for each setting. It stops and returns the first error.

func (*SettingsFrame) HasDuplicates

func (f *SettingsFrame) HasDuplicates() bool

HasDuplicates reports whether f contains any duplicate setting IDs.

func (*SettingsFrame) IsAck

func (f *SettingsFrame) IsAck() bool

func (*SettingsFrame) NumSettings

func (f *SettingsFrame) NumSettings() int

func (*SettingsFrame) Setting

func (f *SettingsFrame) Setting(i int) Setting

Setting returns the setting from the frame at the given 0-based index. The index must be >= 0 and less than f.NumSettings().

func (*SettingsFrame) Value

func (f *SettingsFrame) Value(id SettingID) (v uint32, ok bool)

type StreamError

StreamError is an error that only affects one stream within an HTTP/2 connection.

type StreamError struct {
    StreamID uint32
    Code     ErrCode
    Cause    error // optional additional detail
}

func (StreamError) As

func (e StreamError) As(target any) bool

This As function permits converting a StreamError into a x/net/http2.StreamError.

func (StreamError) Error

func (e StreamError) Error() string

type Transport

Transport is an HTTP/2 Transport.

A Transport internally caches connections to servers. It is safe for concurrent use by multiple goroutines.

type Transport struct {
    // contains filtered or unexported fields
}

func NewTransport

func NewTransport(t1 TransportConfig) *Transport

func (*Transport) AddConn

func (t *Transport) AddConn(scheme, authority string, c net.Conn) error

func (*Transport) CloseIdleConnections

func (t *Transport) CloseIdleConnections()

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.

func (*Transport) IdleConnStrsForTesting

func (t *Transport) IdleConnStrsForTesting() []string

func (*Transport) NewClientConn

func (t *Transport) NewClientConn(c net.Conn, internalStateHook func()) (NetHTTPClientConn, error)

func (*Transport) RoundTrip

func (t *Transport) RoundTrip(req *ClientRequest) (*ClientResponse, error)

func (*Transport) RoundTripOpt

func (t *Transport) RoundTripOpt(req *ClientRequest, opt RoundTripOpt) (*ClientResponse, error)

RoundTripOpt is like RoundTrip, but takes options.

type TransportConfig

TransportConfig is configuration from an http.Transport.

type TransportConfig interface {
    MaxHeaderListSize() int64
    MaxResponseHeaderBytes() int64
    DisableCompression() bool
    DisableKeepAlives() bool
    ExpectContinueTimeout() time.Duration
    ResponseHeaderTimeout() time.Duration
    IdleConnTimeout() time.Duration
    HTTP2Config() Config
}

type UnknownFrame

An UnknownFrame is the frame type returned when the frame type is unknown or no specific frame type parser exists.

type UnknownFrame struct {
    FrameHeader
    // contains filtered or unexported fields
}

func (*UnknownFrame) Payload

func (f *UnknownFrame) Payload() []byte

Payload returns the frame's payload (after the header). It is not valid to call this method after a subsequent call to Framer.ReadFrame, nor is it valid to retain the returned slice. The memory is owned by the Framer and is invalidated when the next frame is read.

type WindowUpdateFrame

A WindowUpdateFrame is used to implement flow control. See https://httpwg.org/specs/rfc7540.html#rfc.section.6.9

type WindowUpdateFrame struct {
    FrameHeader
    Increment uint32 // never read with high bit set
}

type WriteScheduler

WriteScheduler is the interface implemented by HTTP/2 write schedulers. Methods are never called concurrently.

type WriteScheduler interface {
    // OpenStream opens a new stream in the write scheduler.
    // It is illegal to call this with streamID=0 or with a streamID that is
    // already open -- the call may panic.
    OpenStream(streamID uint32, options OpenStreamOptions)

    // CloseStream closes a stream in the write scheduler. Any frames queued on
    // this stream should be discarded. It is illegal to call this on a stream
    // that is not open -- the call may panic.
    CloseStream(streamID uint32)

    // AdjustStream adjusts the priority of the given stream. This may be called
    // on a stream that has not yet been opened or has been closed. Note that
    // RFC 7540 allows PRIORITY frames to be sent on streams in any state. See:
    // https://tools.ietf.org/html/rfc7540#section-5.1
    AdjustStream(streamID uint32, priority PriorityParam)

    // Push queues a frame in the scheduler. In most cases, this will not be
    // called with wr.StreamID()!=0 unless that stream is currently open. The one
    // exception is RST_STREAM frames, which may be sent on idle or closed streams.
    Push(wr FrameWriteRequest)

    // Pop dequeues the next frame to write. Returns false if no frames can
    // be written. Frames with a given wr.StreamID() are Pop'd in the same
    // order they are Push'd, except RST_STREAM frames. No frames should be
    // discarded except by CloseStream.
    Pop() (wr FrameWriteRequest, ok bool)
}