Documentation ¶
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.
See https://http2.golang.org/ for a test server running this code.
Index ¶
- Constants
- Variables
- func NewHostClient(c *config.ClientConfig) client.HostClient
- func NewResponseWriter(conn network.Conn) (network.ExtWriter, error)
- func Record(ti traceinfo.TraceInfo, event stats.Event, err error)
- type BaseEngine
- type ClientConnState
- type ConnectionError
- type ContinuationFrame
- type DataFrame
- type ErrCode
- type Flags
- type Frame
- type FrameHeader
- type FrameType
- type FrameWriteRequest
- type Framer
- func (fr *Framer) ErrorDetail() error
- func (fr *Framer) ReadFrame() (Frame, 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) 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
- type GoAwayFrame
- type HeadersFrame
- type HeadersFrameParam
- type HostClient
- func (hc *HostClient) CloseIdleConnections()
- func (hc *HostClient) ConnectionCount() int
- func (hc *HostClient) Do(ctx context.Context, req *protocol.Request, rsp *protocol.Response) error
- func (hc *HostClient) Get(ctx context.Context, dst []byte, url string) (statusCode int, body []byte, err error)
- func (hc *HostClient) SetDynamicConfig(dc *client.DynamicConfig)
- func (hc *HostClient) ShouldRemove() bool
- type MetaHeadersFrame
- type OpenStreamOptions
- type PingFrame
- type PriorityFrame
- type PriorityParam
- type PriorityWriteSchedulerConfig
- type PushPromiseFrame
- type PushPromiseParam
- type RSTStreamFrame
- type Server
- type Setting
- type SettingID
- 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
- type UnknownFrame
- type WindowUpdateFrame
- type WriteScheduler
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 ( Name = "Http2" Version = "v0.0.1" )
Name and Version info of this framework, used for statistics and debug
Variables ¶
var ( ErrRecursivePush = errors.New("http2: recursive push not allowed") ErrPushLimitReached = errors.New("http2: push would exceed peer's SETTINGS_MAX_CONCURRENT_STREAMS") )
Push errors.
var DebugGoroutines = os.Getenv("DEBUG_HTTP2_GOROUTINES") == "1"
var ErrFrameTooLarge = errors.New("http2: frame too large")
ErrFrameTooLarge is returned from Framer.ReadFrame when the peer sends a frame that is larger than declared with SetMaxReadFrameSize.
var (
VerboseLogs bool
)
Functions ¶
func NewHostClient ¶
func NewHostClient(c *config.ClientConfig) client.HostClient
func NewResponseWriter ¶ added in v0.1.6
Types ¶
type BaseEngine ¶
func (*BaseEngine) AcquireReqCtx ¶
func (b *BaseEngine) AcquireReqCtx() *app.RequestContext
func (*BaseEngine) ReleaseReqCtx ¶
func (b *BaseEngine) ReleaseReqCtx(ctx *app.RequestContext)
type ClientConnState ¶
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 }
ClientConnState describes the state of a ClientConn.
type ConnectionError ¶
type ConnectionError ErrCode
ConnectionError is an error that results in the termination of the entire connection.
func (ConnectionError) Error ¶
func (e ConnectionError) Error() string
type ContinuationFrame ¶
type ContinuationFrame struct { FrameHeader // contains filtered or unexported fields }
A ContinuationFrame is used to continue a sequence of header block fragments. See http://http2.github.io/http2-spec/#rfc.section.6.10
func (*ContinuationFrame) HeaderBlockFragment ¶
func (f *ContinuationFrame) HeaderBlockFragment() []byte
func (*ContinuationFrame) HeadersEnded ¶
func (f *ContinuationFrame) HeadersEnded() bool
type DataFrame ¶
type DataFrame struct { FrameHeader // contains filtered or unexported fields }
A DataFrame conveys arbitrary, variable-length sequences of octets associated with a stream. See http://http2.github.io/http2-spec/#rfc.section.6.1
func (*DataFrame) Data ¶
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 ¶
type ErrCode ¶
type ErrCode uint32
An ErrCode is an unsigned 32-bit error code as defined in the HTTP/2 spec.
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 )
type Flags ¶
type Flags uint8
Flags is a bitmask of HTTP/2 flags. The meaning of flags varies depending on the frame type.
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 )
Frame-specific FrameHeader flag bits.
type Frame ¶
type Frame interface { Header() FrameHeader // contains filtered or unexported methods }
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 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 }
A FrameHeader is the 9 byte header of all HTTP/2 frames.
See http://http2.github.io/http2-spec/#FrameHeader
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 ¶
type FrameType uint8
A FrameType is a registered frame type as defined in http://http2.github.io/http2-spec/#rfc.section.11.2
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 )
type FrameWriteRequest ¶
type FrameWriteRequest struct {
// contains filtered or unexported fields
}
FrameWriteRequest is a request to write a frame.
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 ¶
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 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 // contains filtered or unexported fields }
A Framer reads and writes Frames.
func (*Framer) ErrorDetail ¶
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 ¶
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.
func (*Framer) SetMaxReadFrameSize ¶
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 ¶
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 ¶
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 (*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) 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) 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 ¶
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 ¶
WriteRawFrame writes a raw frame. This can be used to write extension frames unknown to this package.
func (*Framer) WriteSettings ¶
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 ¶
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 ¶
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.
func (GoAwayError) Error ¶
func (e GoAwayError) Error() string
type GoAwayFrame ¶
type GoAwayFrame struct { FrameHeader LastStreamID uint32 ErrCode ErrCode // contains filtered or unexported fields }
A GoAwayFrame informs the remote peer to stop creating streams on this connection. See http://http2.github.io/http2-spec/#rfc.section.6.8
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 HeadersFrame ¶
type HeadersFrame struct { FrameHeader // Priority is set if FlagHeadersPriority is set in the FrameHeader. Priority PriorityParam // contains filtered or unexported fields }
A HeadersFrame is used to open a stream and additionally carries a header block fragment.
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 ¶
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 }
HeadersFrameParam are the parameters for writing a HEADERS frame.
type HostClient ¶
type HostClient struct { *config.ClientConfig // Comma-separated list of upstream HTTP server host addresses, // which are passed to Dial in a round-robin manner. // // Each address may contain port if default dialer is used. // For example, // // - foobar.com:80 // - foobar.com:443 // - foobar.com:8080 Addr string IsTLS bool // contains filtered or unexported fields }
HostClient balances http requests among hosts listed in Addr.
HostClient may be used for balancing load among multiple upstream hosts. While multiple addresses passed to HostClient.Addr may be used for balancing load among them, it would be better using LBClient instead, since HostClient may unevenly balance load among upstream hosts.
It is forbidden copying HostClient instances. Create new instances instead.
It is safe calling HostClient methods from concurrently running goroutines.
func (*HostClient) CloseIdleConnections ¶
func (hc *HostClient) CloseIdleConnections()
func (*HostClient) ConnectionCount ¶
func (hc *HostClient) ConnectionCount() int
func (*HostClient) Get ¶
func (hc *HostClient) Get(ctx context.Context, dst []byte, url string) (statusCode int, body []byte, err error)
Get returns the status code and body of url.
The contents of dst will be replaced by the body and returned, if the dst is too small a new slice will be allocated.
The function follows redirects. Use Do* for manually handling redirects.
func (*HostClient) SetDynamicConfig ¶
func (hc *HostClient) SetDynamicConfig(dc *client.DynamicConfig)
func (*HostClient) ShouldRemove ¶
func (hc *HostClient) ShouldRemove() bool
type MetaHeadersFrame ¶
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 }
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.
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 OpenStreamOptions ¶
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 }
OpenStreamOptions specifies extra options for WriteScheduler.OpenStream.
type PingFrame ¶
type PingFrame struct { FrameHeader Data [8]byte }
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 http://http2.github.io/http2-spec/#rfc.section.6.7
type PriorityFrame ¶
type PriorityFrame struct { FrameHeader PriorityParam }
A PriorityFrame specifies the sender-advised priority of a stream. See http://http2.github.io/http2-spec/#rfc.section.6.3
type PriorityParam ¶
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 }
PriorityParam are the stream prioritzation parameters.
func (PriorityParam) IsZero ¶
func (p PriorityParam) IsZero() bool
type PriorityWriteSchedulerConfig ¶
type PriorityWriteSchedulerConfig struct { // 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." MaxClosedNodesInTree int // 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). MaxIdleNodesInTree int // 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. ThrottleOutOfOrderWrites bool }
PriorityWriteSchedulerConfig configures a priorityWriteScheduler.
type PushPromiseFrame ¶
type PushPromiseFrame struct { FrameHeader PromiseID uint32 // contains filtered or unexported fields }
A PushPromiseFrame is used to initiate a server stream. See http://http2.github.io/http2-spec/#rfc.section.6.6
func (*PushPromiseFrame) HeaderBlockFragment ¶
func (f *PushPromiseFrame) HeaderBlockFragment() []byte
func (*PushPromiseFrame) HeadersEnded ¶
func (f *PushPromiseFrame) HeadersEnded() bool
type PushPromiseParam ¶
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 }
PushPromiseParam are the parameters for writing a PUSH_PROMISE frame.
type RSTStreamFrame ¶
type RSTStreamFrame struct { FrameHeader ErrCode ErrCode }
A RSTStreamFrame allows for abnormal termination of a stream. See http://http2.github.io/http2-spec/#rfc.section.6.4
type Server ¶
type Server struct { BaseEngine // NewWriteScheduler constructs a write scheduler for a connection. // If nil, a default scheduler is chosen. NewWriteScheduler func() WriteScheduler // contains filtered or unexported fields }
Server is an HTTP/2 server.
func (*Server) Serve ¶
Serve serves HTTP/2 requests on the provided connection and blocks until the connection is no longer readable.
onData 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.
onData 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 Setting ¶
type Setting struct { // ID is which setting is being set. // See http://http2.github.io/http2-spec/#SettingValues ID SettingID // Val is the value. Val uint32 }
Setting is a setting parameter: which setting it is, and its value.
type SettingID ¶
type SettingID uint16
A SettingID is an HTTP/2 setting as defined in http://http2.github.io/http2-spec/#iana-settings
type SettingsFrame ¶
type SettingsFrame struct { FrameHeader // contains filtered or unexported fields }
A SettingsFrame conveys configuration parameters that affect how endpoints communicate, such as preferences and constraints on peer behavior.
See http://http2.github.io/http2-spec/#SETTINGS
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().
type StreamError ¶
StreamError is an error that only affects one stream within an HTTP/2 connection.
func (StreamError) Error ¶
func (e StreamError) Error() string
type UnknownFrame ¶
type UnknownFrame struct { FrameHeader // contains filtered or unexported fields }
An UnknownFrame is the frame type returned when the frame type is unknown or no specific frame type parser exists.
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 ¶
type WindowUpdateFrame struct { FrameHeader Increment uint32 // never read with high bit set }
A WindowUpdateFrame is used to implement flow control. See http://http2.github.io/http2-spec/#rfc.section.6.9
type WriteScheduler ¶
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. No frames should be discarded except by CloseStream. Pop() (wr FrameWriteRequest, ok bool) }
WriteScheduler is the interface implemented by HTTP/2 write schedulers. Methods are never called concurrently.
func NewPriorityWriteScheduler ¶
func NewPriorityWriteScheduler(cfg *PriorityWriteSchedulerConfig) WriteScheduler
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.
func NewRandomWriteScheduler ¶
func NewRandomWriteScheduler() WriteScheduler
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.