package http2

Import Path
	golang.org/x/net/http2 (on go.dev)

Dependency Relation
	imports 31 packages, and imported by one package

Involved Source Files ascii.go ciphers.go client_conn_pool.go databuffer.go errors.go flow.go frame.go go111.go go115.go go118.go gotrack.go headermap.go 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. See https://http2.golang.org/ for a test server running this code. pipe.go server.go transport.go write.go writesched.go writesched_priority.go writesched_random.go
Package-Level Type Names (total 114, in which 37 are exported)
/* sort exporteds by: | */
ClientConn is the state of a single HTTP/2 client connection to an HTTP/2 server. 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. Close closes the client connection immediately. In-flight requests are interrupted. For a graceful shutdown, use Shutdown instead. Ping sends a PING frame to the server and waits for the ack. ReserveNewRequest is like CanTakeNewRequest but also reserves a concurrent stream in cc. The reservation is decremented on the next call to RoundTrip. (*ClientConn) RoundTrip(req *http.Request) (*http.Response, error) SetDoNotReuse marks cc as not reusable for future HTTP requests. Shutdown gracefully closes the client connection, waiting for running streams to complete. State returns a snapshot of cc's state. *ClientConn : database/sql/driver.Pinger *ClientConn : io.Closer *ClientConn : net/http.RoundTripper func ClientConnPool.GetClientConn(req *http.Request, addr string) (*ClientConn, error) func (*Transport).NewClientConn(c net.Conn) (*ClientConn, error) func ClientConnPool.MarkDead(*ClientConn)
ClientConnPool manages a pool of HTTP/2 client connections. GetClientConn returns a specific HTTP/2 connection (usually a TLS-TCP connection) to an HTTP/2 server. On success, the returned ClientConn accounts for the upcoming RoundTrip call, so the caller should not omit it. If the caller needs to, ClientConn.RoundTrip can be called with a bogus new(http.Request) to release the stream reservation. ( ClientConnPool) MarkDead(*ClientConn)
ClientConnState describes the state of a ClientConn. Closed is whether the connection is closed. 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. LastIdle, if non-zero, is when the connection last transitioned to idle state. MaxConcurrentStreams is how many concurrent streams the peer advertised as acceptable. Zero means no SETTINGS frame has been received yet. StreamsActive is how many streams are active. 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. StreamsReserved is how many streams have been reserved via ClientConn.ReserveNewRequest. func (*ClientConn).State() ClientConnState
ConnectionError is an error that results in the termination of the entire connection. ( ConnectionError) Error() string ConnectionError : error
A ContinuationFrame is used to continue a sequence of header block fragments. See https://httpwg.org/specs/rfc7540.html#rfc.section.6.10 FrameHeader FrameHeader Flags are the 1 byte of 8 potential bit flags per frame. They are specific to the frame type. 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. StreamID is which stream this frame is for. Certain frames are not stream-specific, in which case this field is 0. 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). Header returns h. It exists so FrameHeaders can be embedded in other specific frame types and implement the Frame interface. (*ContinuationFrame) HeaderBlockFragment() []byte (*ContinuationFrame) HeadersEnded() bool ( ContinuationFrame) String() string *ContinuationFrame : Frame ContinuationFrame : expvar.Var ContinuationFrame : fmt.Stringer
A DataFrame conveys arbitrary, variable-length sequences of octets associated with a stream. See https://httpwg.org/specs/rfc7540.html#rfc.section.6.1 FrameHeader FrameHeader Flags are the 1 byte of 8 potential bit flags per frame. They are specific to the frame type. 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. StreamID is which stream this frame is for. Certain frames are not stream-specific, in which case this field is 0. 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). 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. Header returns h. It exists so FrameHeaders can be embedded in other specific frame types and implement the Frame interface. (*DataFrame) StreamEnded() bool ( DataFrame) String() string *DataFrame : Frame DataFrame : expvar.Var DataFrame : fmt.Stringer
An ErrCode is an unsigned 32-bit error code as defined in the HTTP/2 spec. ( ErrCode) String() string ErrCode : expvar.Var ErrCode : fmt.Stringer func (*Framer).WriteGoAway(maxStreamID uint32, code ErrCode, debugData []byte) error func (*Framer).WriteRSTStream(streamID uint32, code ErrCode) error const ErrCodeCancel const ErrCodeCompression const ErrCodeConnect const ErrCodeEnhanceYourCalm const ErrCodeFlowControl const ErrCodeFrameSize const ErrCodeHTTP11Required const ErrCodeInadequateSecurity const ErrCodeInternal const ErrCodeNo const ErrCodeProtocol const ErrCodeRefusedStream const ErrCodeSettingsTimeout const ErrCodeStreamClosed
Flags is a bitmask of HTTP/2 flags. The meaning of flags varies depending on the frame type. Has reports whether f contains all (0 or more) flags in v. func Flags.Has(v Flags) bool func (*Framer).WriteRawFrame(t FrameType, flags Flags, streamID uint32, payload []byte) error const FlagContinuationEndHeaders const FlagDataEndStream const FlagDataPadded const FlagHeadersEndHeaders const FlagHeadersEndStream const FlagHeadersPadded const FlagHeadersPriority const FlagPingAck const FlagPushPromiseEndHeaders const FlagPushPromisePadded const FlagSettingsAck
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. ( Frame) Header() FrameHeader *ContinuationFrame *DataFrame *FrameHeader *GoAwayFrame *HeadersFrame MetaHeadersFrame *PingFrame *PriorityFrame *PushPromiseFrame *RSTStreamFrame *SettingsFrame *UnknownFrame *WindowUpdateFrame func (*Framer).ReadFrame() (Frame, error)
A FrameHeader is the 9 byte header of all HTTP/2 frames. See https://httpwg.org/specs/rfc7540.html#FrameHeader Flags are the 1 byte of 8 potential bit flags per frame. They are specific to the frame type. 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. StreamID is which stream this frame is for. Certain frames are not stream-specific, in which case this field is 0. 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). Header returns h. It exists so FrameHeaders can be embedded in other specific frame types and implement the Frame interface. ( FrameHeader) String() string *FrameHeader : Frame FrameHeader : expvar.Var FrameHeader : fmt.Stringer func ReadFrameHeader(r io.Reader) (FrameHeader, error) func Frame.Header() FrameHeader func FrameHeader.Header() FrameHeader
A Framer reads and writes Frames. 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. 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. 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. ReadMetaHeaders if non-nil causes ReadFrame to merge HEADERS and CONTINUATION frames together and return MetaHeadersFrame instead. 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. ReadFrame reads a single frame. The returned Frame is only valid until the next call to ReadFrame. 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. 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. 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. 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. 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. 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. (*Framer) WriteGoAway(maxStreamID uint32, code ErrCode, debugData []byte) 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. (*Framer) WritePing(ack bool, data [8]byte) 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. 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. 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. WriteRawFrame writes a raw frame. This can be used to write extension frames unknown to this package. 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. 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. 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. func NewFramer(w io.Writer, r io.Reader) *Framer
A FrameType is a registered frame type as defined in https://httpwg.org/specs/rfc7540.html#rfc.section.11.2 ( FrameType) String() string FrameType : expvar.Var FrameType : fmt.Stringer func (*Framer).WriteRawFrame(t FrameType, flags Flags, streamID uint32, payload []byte) error const FrameContinuation const FrameData const FrameGoAway const FrameHeaders const FramePing const FramePriority const FramePushPromise const FrameRSTStream const FrameSettings const FrameWindowUpdate
FrameWriteRequest is a request to write a frame. 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. DataSize returns the number of flow control bytes that must be consumed to write this entire frame. This is 0 for non-DATA frames. 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. String is for debugging only. FrameWriteRequest : expvar.Var FrameWriteRequest : fmt.Stringer func FrameWriteRequest.Consume(n int32) (FrameWriteRequest, FrameWriteRequest, int) func FrameWriteRequest.Consume(n int32) (FrameWriteRequest, FrameWriteRequest, int) func WriteScheduler.Pop() (wr FrameWriteRequest, ok bool) func WriteScheduler.Push(wr FrameWriteRequest)
GoAwayError is returned by the Transport when the server closes the TCP connection after sending a GOAWAY frame. DebugData string ErrCode ErrCode LastStreamID uint32 ( GoAwayError) Error() string GoAwayError : error
A GoAwayFrame informs the remote peer to stop creating streams on this connection. See https://httpwg.org/specs/rfc7540.html#rfc.section.6.8 ErrCode ErrCode FrameHeader FrameHeader Flags are the 1 byte of 8 potential bit flags per frame. They are specific to the frame type. 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. StreamID is which stream this frame is for. Certain frames are not stream-specific, in which case this field is 0. 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). LastStreamID uint32 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. Header returns h. It exists so FrameHeaders can be embedded in other specific frame types and implement the Frame interface. ( GoAwayFrame) String() string *GoAwayFrame : Frame GoAwayFrame : expvar.Var GoAwayFrame : fmt.Stringer
A HeadersFrame is used to open a stream and additionally carries a header block fragment. FrameHeader FrameHeader Flags are the 1 byte of 8 potential bit flags per frame. They are specific to the frame type. 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. StreamID is which stream this frame is for. Certain frames are not stream-specific, in which case this field is 0. 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). Priority is set if FlagHeadersPriority is set in the FrameHeader. (*HeadersFrame) HasPriority() bool Header returns h. It exists so FrameHeaders can be embedded in other specific frame types and implement the Frame interface. (*HeadersFrame) HeaderBlockFragment() []byte (*HeadersFrame) HeadersEnded() bool (*HeadersFrame) StreamEnded() bool ( HeadersFrame) String() string *HeadersFrame : Frame HeadersFrame : expvar.Var HeadersFrame : fmt.Stringer
HeadersFrameParam are the parameters for writing a HEADERS frame. BlockFragment is part (or all) of a Header Block. EndHeaders indicates that this frame contains an entire header block and is not followed by any CONTINUATION frames. 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. PadLength is the optional number of bytes of zeros to add to this frame. Priority, if non-zero, includes stream priority information in the HEADER frame. StreamID is the required Stream ID to initiate. func (*Framer).WriteHeaders(p HeadersFrameParam) error
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. 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. HeadersFrame *HeadersFrame HeadersFrame.FrameHeader FrameHeader Flags are the 1 byte of 8 potential bit flags per frame. They are specific to the frame type. 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. StreamID is which stream this frame is for. Certain frames are not stream-specific, in which case this field is 0. 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). Priority is set if FlagHeadersPriority is set in the FrameHeader. Truncated is whether the max header list size limit was hit and Fields is incomplete. The hpack decoder state is still valid, however. ( MetaHeadersFrame) HasPriority() bool Header returns h. It exists so FrameHeaders can be embedded in other specific frame types and implement the Frame interface. ( MetaHeadersFrame) HeaderBlockFragment() []byte ( MetaHeadersFrame) HeadersEnded() bool PseudoFields returns the pseudo header fields of mh. The caller does not own the returned slice. PseudoValue returns the given pseudo header field's value. The provided pseudo field should not contain the leading colon. RegularFields returns the regular (non-pseudo) header fields of mh. The caller does not own the returned slice. ( MetaHeadersFrame) StreamEnded() bool ( MetaHeadersFrame) String() string MetaHeadersFrame : Frame MetaHeadersFrame : expvar.Var MetaHeadersFrame : fmt.Stringer
OpenStreamOptions specifies extra options for WriteScheduler.OpenStream. PusherID is zero if the stream was initiated by the client. Otherwise, PusherID names the stream that pushed the newly opened stream. func WriteScheduler.OpenStream(streamID uint32, options OpenStreamOptions)
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 Data [8]byte FrameHeader FrameHeader Flags are the 1 byte of 8 potential bit flags per frame. They are specific to the frame type. 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. StreamID is which stream this frame is for. Certain frames are not stream-specific, in which case this field is 0. 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). Header returns h. It exists so FrameHeaders can be embedded in other specific frame types and implement the Frame interface. (*PingFrame) IsAck() bool ( PingFrame) String() string *PingFrame : Frame PingFrame : expvar.Var PingFrame : fmt.Stringer
A PriorityFrame specifies the sender-advised priority of a stream. See https://httpwg.org/specs/rfc7540.html#rfc.section.6.3 FrameHeader FrameHeader Flags are the 1 byte of 8 potential bit flags per frame. They are specific to the frame type. 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. StreamID is which stream this frame is for. Certain frames are not stream-specific, in which case this field is 0. 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). PriorityParam PriorityParam Exclusive is whether the dependency is exclusive. StreamDep is a 31-bit stream identifier for the stream that this stream depends on. Zero means no dependency. 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." Header returns h. It exists so FrameHeaders can be embedded in other specific frame types and implement the Frame interface. ( PriorityFrame) IsZero() bool ( PriorityFrame) String() string *PriorityFrame : Frame PriorityFrame : expvar.Var PriorityFrame : fmt.Stringer
PriorityParam are the stream prioritzation parameters. Exclusive is whether the dependency is exclusive. StreamDep is a 31-bit stream identifier for the stream that this stream depends on. Zero means no dependency. 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." ( PriorityParam) IsZero() bool func (*Framer).WritePriority(streamID uint32, p PriorityParam) error func WriteScheduler.AdjustStream(streamID uint32, priority PriorityParam)
PriorityWriteSchedulerConfig configures a priorityWriteScheduler. MaxClosedNodesInTree controls the maximum number of closed streams to retain in the priority tree. Setting this to zero saves a small amount of memory at the cost of performance. See RFC 7540, Section 5.3.4: "It is possible for a stream to become closed while prioritization information ... is in transit. ... This potentially creates suboptimal prioritization, since the stream could be given a priority that is different from what is intended. To avoid these problems, an endpoint SHOULD retain stream prioritization state for a period after streams become closed. The longer state is retained, the lower the chance that streams are assigned incorrect or default priority values." MaxIdleNodesInTree controls the maximum number of idle streams to retain in the priority tree. Setting this to zero saves a small amount of memory at the cost of performance. See RFC 7540, Section 5.3.4: Similarly, streams that are in the "idle" state can be assigned priority or become a parent of other streams. This allows for the creation of a grouping node in the dependency tree, which enables more flexible expressions of priority. Idle streams begin with a default priority (Section 5.3.5). ThrottleOutOfOrderWrites enables write throttling to help ensure that data is delivered in priority order. This works around a race where stream B depends on stream A and both streams are about to call Write to queue DATA frames. If B wins the race, a naive scheduler would eagerly write as much data from B as possible, but this is suboptimal because A is a higher-priority stream. With throttling enabled, we write a small amount of data from B to minimize the amount of bandwidth that B can steal from A. func NewPriorityWriteScheduler(cfg *PriorityWriteSchedulerConfig) WriteScheduler
A PushPromiseFrame is used to initiate a server stream. See https://httpwg.org/specs/rfc7540.html#rfc.section.6.6 FrameHeader FrameHeader Flags are the 1 byte of 8 potential bit flags per frame. They are specific to the frame type. 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. StreamID is which stream this frame is for. Certain frames are not stream-specific, in which case this field is 0. 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). PromiseID uint32 Header returns h. It exists so FrameHeaders can be embedded in other specific frame types and implement the Frame interface. (*PushPromiseFrame) HeaderBlockFragment() []byte (*PushPromiseFrame) HeadersEnded() bool ( PushPromiseFrame) String() string *PushPromiseFrame : Frame PushPromiseFrame : expvar.Var PushPromiseFrame : fmt.Stringer
PushPromiseParam are the parameters for writing a PUSH_PROMISE frame. BlockFragment is part (or all) of a Header Block. EndHeaders indicates that this frame contains an entire header block and is not followed by any CONTINUATION frames. PadLength is the optional number of bytes of zeros to add to this frame. PromiseID is the required Stream ID which this Push Promises StreamID is the required Stream ID to initiate. func (*Framer).WritePushPromise(p PushPromiseParam) error
RoundTripOpt are options for the Transport.RoundTripOpt method. OnlyCachedConn controls whether RoundTripOpt may create a new TCP connection. If set true and no cached connection is available, RoundTripOpt will return ErrNoCachedConn. func (*Transport).RoundTripOpt(req *http.Request, opt RoundTripOpt) (*http.Response, error)
A RSTStreamFrame allows for abnormal termination of a stream. See https://httpwg.org/specs/rfc7540.html#rfc.section.6.4 ErrCode ErrCode FrameHeader FrameHeader Flags are the 1 byte of 8 potential bit flags per frame. They are specific to the frame type. 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. StreamID is which stream this frame is for. Certain frames are not stream-specific, in which case this field is 0. 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). Header returns h. It exists so FrameHeaders can be embedded in other specific frame types and implement the Frame interface. ( RSTStreamFrame) String() string *RSTStreamFrame : Frame RSTStreamFrame : expvar.Var RSTStreamFrame : fmt.Stringer
ServeConnOpts are options for the Server.ServeConn method. BaseConfig optionally sets the base configuration for values. If nil, defaults are used. Context is the base context to use. If nil, context.Background is used. 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. SawClientPreface is set if the HTTP/2 connection preface has already been read from the connection. Settings is the decoded contents of the HTTP2-Settings header in an h2c upgrade request. UpgradeRequest is an initial request received on a connection undergoing an h2c upgrade. The request body must have been completely read from the connection before calling ServeConn, and the 101 Switching Protocols response written. func (*Server).ServeConn(c net.Conn, opts *ServeConnOpts)
Server is an HTTP/2 server. CountError, if non-nil, is called on HTTP/2 server 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. 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. MaxConcurrentStreams optionally specifies the number of concurrent streams that each client may have open at a time. This is unrelated to the number of http.Handler goroutines which may be active globally, which is MaxHandlers. If zero, MaxConcurrentStreams defaults to at least 100, per the HTTP/2 spec's recommendations. MaxDecoderHeaderTableSize optionally specifies the http2 SETTINGS_HEADER_TABLE_SIZE to send in the initial settings frame. It 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. 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. 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 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. MaxUploadBufferPerConnection is the size of the initial flow control window for each connections. The HTTP/2 spec does not 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. 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. NewWriteScheduler constructs a write scheduler for a connection. If nil, a default scheduler is chosen. PermitProhibitedCipherSuites, if true, permits the use of cipher suites prohibited by the HTTP/2 spec. 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. func ConfigureServer(s *http.Server, conf *Server) error
Setting is a setting parameter: which setting it is, and its value. ID is which setting is being set. See https://httpwg.org/specs/rfc7540.html#SettingFormat Val is the value. ( Setting) String() string Valid reports whether the setting is valid. Setting : expvar.Var Setting : fmt.Stringer func (*SettingsFrame).Setting(i int) Setting func (*Framer).WriteSettings(settings ...Setting) error
A SettingID is an HTTP/2 setting as defined in https://httpwg.org/specs/rfc7540.html#iana-settings ( SettingID) String() string SettingID : expvar.Var SettingID : fmt.Stringer func (*SettingsFrame).Value(id SettingID) (v uint32, ok bool) const SettingEnablePush const SettingHeaderTableSize const SettingInitialWindowSize const SettingMaxConcurrentStreams const SettingMaxFrameSize const SettingMaxHeaderListSize
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 FrameHeader FrameHeader Flags are the 1 byte of 8 potential bit flags per frame. They are specific to the frame type. 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. StreamID is which stream this frame is for. Certain frames are not stream-specific, in which case this field is 0. 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). ForeachSetting runs fn for each setting. It stops and returns the first error. HasDuplicates reports whether f contains any duplicate setting IDs. Header returns h. It exists so FrameHeaders can be embedded in other specific frame types and implement the Frame interface. (*SettingsFrame) IsAck() bool (*SettingsFrame) NumSettings() int Setting returns the setting from the frame at the given 0-based index. The index must be >= 0 and less than f.NumSettings(). ( SettingsFrame) String() string (*SettingsFrame) Value(id SettingID) (v uint32, ok bool) *SettingsFrame : Frame SettingsFrame : expvar.Var SettingsFrame : fmt.Stringer
StreamError is an error that only affects one stream within an HTTP/2 connection. // optional additional detail Code ErrCode StreamID uint32 ( StreamError) Error() string StreamError : error
Transport is an HTTP/2 Transport. A Transport internally caches connections to servers. It is safe for concurrent use by multiple goroutines. AllowHTTP, if true, permits HTTP/2 requests using the insecure, plain-text "http" scheme. Note that this does not enable h2c support. ConnPool optionally specifies an alternate connection pool to use. If nil, the default is used. 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. DialTLS specifies an optional dial function for creating TLS connections for requests. 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. DialTLSContext specifies an optional dial function with context for creating TLS connections for requests. If DialTLSContext and DialTLS is nil, tls.Dial is used. If the returned net.Conn has a ConnectionState method like tls.Conn, it will be used to set http.Response.TLS. DisableCompression, if true, prevents the Transport from requesting compression with an "Accept-Encoding: gzip" request header when the Request contains no existing Accept-Encoding value. If the Transport requests gzip on its own and gets a gzipped response, it's transparently decoded in the Response.Body. However, if the user explicitly requested gzip it is not automatically uncompressed. MaxDecoderHeaderTableSize optionally specifies the http2 SETTINGS_HEADER_TABLE_SIZE to send in the initial settings frame. It 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. 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. MaxHeaderListSize is the http2 SETTINGS_MAX_HEADER_LIST_SIZE to send in the initial settings frame. It is how many bytes of response headers are allowed. Unlike the http2 spec, zero here means to use a default limit (currently 10MB). If you actually 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. MaxReadFrameSize is the http2 SETTINGS_MAX_FRAME_SIZE to send in the initial settings frame. It is the size in bytes of the largest frame payload that the sender is willing to receive. If 0, no setting is sent, and the value is provided by the peer, which should be 16384 according to the spec: https://datatracker.ietf.org/doc/html/rfc7540#section-6.5.2. Values are bounded in the range 16k to 16M. PingTimeout is the timeout after which the connection will be closed if a response to Ping is not received. Defaults to 15s. ReadIdleTimeout is the timeout after which a health check using ping frame will be carried out if no frame is received on the connection. Note that a ping response will is considered a received frame, so if there is no other traffic on the connection, the health check will be performed every ReadIdleTimeout interval. If zero, no health check is performed. StrictMaxConcurrentStreams controls whether the server's SETTINGS_MAX_CONCURRENT_STREAMS should be respected globally. If false, new TCP connections are created to the server as needed to keep each under the per-connection SETTINGS_MAX_CONCURRENT_STREAMS limit. If true, the server's SETTINGS_MAX_CONCURRENT_STREAMS is interpreted as a global limit and callers of RoundTrip block when needed, waiting for their turn. TLSClientConfig specifies the TLS configuration to use with tls.Client. If nil, the default configuration is used. 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. 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. (*Transport) NewClientConn(c net.Conn) (*ClientConn, error) (*Transport) RoundTrip(req *http.Request) (*http.Response, error) RoundTripOpt is like RoundTrip, but takes options. *Transport : net/http.RoundTripper func ConfigureTransports(t1 *http.Transport) (*Transport, error)
An UnknownFrame is the frame type returned when the frame type is unknown or no specific frame type parser exists. FrameHeader FrameHeader Flags are the 1 byte of 8 potential bit flags per frame. They are specific to the frame type. 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. StreamID is which stream this frame is for. Certain frames are not stream-specific, in which case this field is 0. 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). Header returns h. It exists so FrameHeaders can be embedded in other specific frame types and implement the Frame interface. 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. ( UnknownFrame) String() string *UnknownFrame : Frame UnknownFrame : expvar.Var UnknownFrame : fmt.Stringer
A WindowUpdateFrame is used to implement flow control. See https://httpwg.org/specs/rfc7540.html#rfc.section.6.9 FrameHeader FrameHeader Flags are the 1 byte of 8 potential bit flags per frame. They are specific to the frame type. 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. StreamID is which stream this frame is for. Certain frames are not stream-specific, in which case this field is 0. 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). // never read with high bit set Header returns h. It exists so FrameHeaders can be embedded in other specific frame types and implement the Frame interface. ( WindowUpdateFrame) String() string *WindowUpdateFrame : Frame WindowUpdateFrame : expvar.Var WindowUpdateFrame : fmt.Stringer
WriteScheduler is the interface implemented by HTTP/2 write schedulers. Methods are never called concurrently. 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 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. 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. 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. 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. func NewPriorityWriteScheduler(cfg *PriorityWriteSchedulerConfig) WriteScheduler func NewRandomWriteScheduler() WriteScheduler
Package-Level Functions (total 91, in which 7 are exported)
ConfigureServer adds HTTP/2 support to a net/http Server. The configuration conf may be nil. ConfigureServer must be called before s begins serving.
ConfigureTransport configures a net/http HTTP/1 Transport to use HTTP/2. It returns an error if t1 has already been HTTP/2-enabled. Use ConfigureTransports instead to configure the HTTP/2 Transport.
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.
NewFramer returns a Framer that writes frames to w and reads them from r.
NewPriorityWriteScheduler constructs a WriteScheduler that schedules frames by following HTTP/2 priorities as described in RFC 7540 Section 5.3. If cfg is nil, default options are used.
NewRandomWriteScheduler constructs a WriteScheduler that ignores HTTP/2 priorities. Control frames like SETTINGS and PING are written before DATA frames, but if no control frames are queued and multiple streams have queued HEADERS or DATA frames, Pop selects a ready stream arbitrarily.
ReadFrameHeader reads 9 bytes from r and returns a FrameHeader. Most users should use Framer.ReadFrame instead.
Package-Level Variables (total 72, in which 6 are exported)
ErrFrameTooLarge is returned from Framer.ReadFrame when the peer sends a frame that is larger than declared with SetMaxReadFrameSize.
Push errors.
Package-Level Constants (total 401, in which 44 are exported)
ClientPreface is the string that must be sent by new connections from clients.
Continuation Frame
Data Frame
Frame-specific FrameHeader flag bits.
Frame-specific FrameHeader flag bits.
Headers Frame
Frame-specific FrameHeader flag bits.
Frame-specific FrameHeader flag bits.
Ping Frame
Frame-specific FrameHeader flag bits.
Frame-specific FrameHeader flag bits.
Settings Frame
NextProtoTLS is the NPN/ALPN protocol negotiated during HTTP/2's TLS setup.
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