Documentation ¶
Index ¶
- Constants
- Variables
- func ConfigureTLSConfig(tlsConf *tls.Config) *tls.Config
- func ListenAndServe(addr, certFile, keyFile string, handler http.Handler) errordeprecated
- func ListenAndServeQUIC(addr, certFile, keyFile string, handler http.Handler) error
- func ListenAndServeTLS(addr, certFile, keyFile string, handler http.Handler) error
- func WriteCapsule(w quicvarint.Writer, ct CapsuleType, value []byte) error
- type CapsuleType
- type Connection
- type ErrCode
- type Error
- type FrameType
- type HTTPStreamer
- type Hijacker
- type QUICEarlyListener
- type RequestStream
- type RoundTripOpt
- type RoundTripper
- type Server
- func (s *Server) Close() error
- func (s *Server) CloseGracefully(timeout time.Duration) error
- func (s *Server) ListenAndServe() error
- func (s *Server) ListenAndServeTLS(certFile, keyFile string) error
- func (s *Server) Serve(conn net.PacketConn) error
- func (s *Server) ServeListener(ln QUICEarlyListener) error
- func (s *Server) ServeQUICConn(conn quic.Connection) error
- func (s *Server) SetQUICHeaders(hdr http.Header) error
- func (s *Server) SetQuicHeaders(hdr http.Header) errordeprecated
- type Settings
- type SingleDestinationRoundTripper
- type Stream
- type StreamType
Constants ¶
const ( // MethodGet0RTT allows a GET request to be sent using 0-RTT. // Note that 0-RTT doesn't provide replay protection and should only be used for idempotent requests. MethodGet0RTT = "GET_0RTT" // MethodHead0RTT allows a HEAD request to be sent using 0-RTT. // Note that 0-RTT doesn't provide replay protection and should only be used for idempotent requests. MethodHead0RTT = "HEAD_0RTT" )
const NextProtoH3 = "h3"
NextProtoH3 is the ALPN protocol negotiated during the TLS handshake, for QUIC v1 and v2.
Variables ¶
var ErrNoAltSvcPort = errors.New("no port can be announced, specify it explicitly using Server.Port or Server.Addr")
ErrNoAltSvcPort is the error returned by SetQUICHeaders when no port was found for Alt-Svc to announce. This can happen if listening on a PacketConn without a port (UNIX socket, for example) and no port is specified in Server.Port or Server.Addr.
var ErrNoCachedConn = errors.New("http3: no cached connection was available")
ErrNoCachedConn is returned when RoundTripper.OnlyCachedConn is set
var RemoteAddrContextKey = &contextKey{"remote-addr"}
RemoteAddrContextKey is a context key. It can be used in HTTP handlers with Context.Value to access the remote address of the connection. The associated value will be of type net.Addr.
Use this value instead of http.Request.RemoteAddr if you require access to the remote address of the connection rather than its string representation.
var ServerContextKey = &contextKey{"http3-server"}
ServerContextKey is a context key. It can be used in HTTP handlers with Context.Value to access the server that started the handler. The associated value will be of type *http3.Server.
Functions ¶
func ConfigureTLSConfig ¶
ConfigureTLSConfig creates a new tls.Config which can be used to create a quic.Listener meant for serving http3. The created tls.Config adds the functionality of detecting the used QUIC version in order to set the correct ALPN value for the http3 connection.
func ListenAndServe
deprecated
func ListenAndServeQUIC ¶
ListenAndServeQUIC listens on the UDP network address addr and calls the handler for HTTP/3 requests on incoming connections. http.DefaultServeMux is used when handler is nil.
func ListenAndServeTLS ¶
ListenAndServeTLS listens on the given network address for both TLS/TCP and QUIC connections in parallel. It returns if one of the two returns an error. http.DefaultServeMux is used when handler is nil. The correct Alt-Svc headers for QUIC are set.
func WriteCapsule ¶
func WriteCapsule(w quicvarint.Writer, ct CapsuleType, value []byte) error
WriteCapsule writes a capsule
Types ¶
type CapsuleType ¶
type CapsuleType uint64
CapsuleType is the type of the capsule.
func ParseCapsule ¶
func ParseCapsule(r quicvarint.Reader) (CapsuleType, io.Reader, error)
ParseCapsule parses the header of a Capsule. It returns an io.LimitedReader that can be used to read the Capsule value. The Capsule value must be read entirely (i.e. until the io.EOF) before using r again.
type Connection ¶
type Connection interface { OpenStream() (quic.Stream, error) OpenStreamSync(context.Context) (quic.Stream, error) OpenUniStream() (quic.SendStream, error) OpenUniStreamSync(context.Context) (quic.SendStream, error) LocalAddr() net.Addr RemoteAddr() net.Addr CloseWithError(quic.ApplicationErrorCode, string) error Context() context.Context ConnectionState() quic.ConnectionState // ReceivedSettings returns a channel that is closed once the client's SETTINGS frame was received. ReceivedSettings() <-chan struct{} // Settings returns the settings received on this connection. Settings() *Settings }
Connection is an HTTP/3 connection. It has all methods from the quic.Connection expect for AcceptStream, AcceptUniStream, SendDatagram and ReceiveDatagram.
type ErrCode ¶
type ErrCode quic.ApplicationErrorCode
const ( ErrCodeNoError ErrCode = 0x100 ErrCodeGeneralProtocolError ErrCode = 0x101 ErrCodeInternalError ErrCode = 0x102 ErrCodeStreamCreationError ErrCode = 0x103 ErrCodeClosedCriticalStream ErrCode = 0x104 ErrCodeFrameUnexpected ErrCode = 0x105 ErrCodeFrameError ErrCode = 0x106 ErrCodeExcessiveLoad ErrCode = 0x107 ErrCodeIDError ErrCode = 0x108 ErrCodeSettingsError ErrCode = 0x109 ErrCodeMissingSettings ErrCode = 0x10a ErrCodeRequestRejected ErrCode = 0x10b ErrCodeRequestCanceled ErrCode = 0x10c ErrCodeRequestIncomplete ErrCode = 0x10d ErrCodeMessageError ErrCode = 0x10e ErrCodeConnectError ErrCode = 0x10f ErrCodeVersionFallback ErrCode = 0x110 ErrCodeDatagramError ErrCode = 0x33 )
type Error ¶
Error is returned from the round tripper (for HTTP clients) and inside the HTTP handler (for HTTP servers) if an HTTP/3 error occurs. See section 8 of RFC 9114.
type HTTPStreamer ¶
type HTTPStreamer interface {
HTTPStream() Stream
}
The HTTPStreamer allows taking over a HTTP/3 stream. The interface is implemented the http.Response.Body. On the client side, the stream will be closed for writing, unless the DontCloseRequestStream RoundTripOpt was set. When a stream is taken over, it's the caller's responsibility to close the stream.
type Hijacker ¶
type Hijacker interface {
Connection() Connection
}
A Hijacker allows hijacking of the stream creating part of a quic.Session from a http.Response.Body. It is used by WebTransport to create WebTransport streams after a session has been established.
type QUICEarlyListener ¶
type QUICEarlyListener interface { Accept(context.Context) (quic.EarlyConnection, error) Addr() net.Addr io.Closer }
A QUICEarlyListener listens for incoming QUIC connections.
type RequestStream ¶
type RequestStream interface { Stream // SendRequestHeader sends the HTTP request. // It is invalid to call it more than once. // It is invalid to call it after Write has been called. SendRequestHeader(req *http.Request) error // ReadResponse reads the HTTP response from the stream. // It is invalid to call it more than once. // It doesn't set Response.Request and Response.TLS. // It is invalid to call it after Read has been called. ReadResponse() (*http.Response, error) }
A RequestStream is an HTTP/3 request stream. When writing to and reading from the stream, data is framed in HTTP/3 DATA frames.
type RoundTripOpt ¶
type RoundTripOpt struct { // OnlyCachedConn controls whether the RoundTripper may create a new QUIC connection. // If set true and no cached connection is available, RoundTripOpt will return ErrNoCachedConn. OnlyCachedConn bool }
RoundTripOpt are options for the Transport.RoundTripOpt method.
type RoundTripper ¶
type RoundTripper struct { // TLSClientConfig specifies the TLS configuration to use with // tls.Client. If nil, the default configuration is used. TLSClientConfig *tls.Config // QUICConfig is the quic.Config used for dialing new connections. // If nil, reasonable default values will be used. QUICConfig *quic.Config // Dial specifies an optional dial function for creating QUIC // connections for requests. // If Dial is nil, a UDPConn will be created at the first request // and will be reused for subsequent connections to other servers. Dial func(ctx context.Context, addr string, tlsCfg *tls.Config, cfg *quic.Config) (quic.EarlyConnection, error) // Enable support for HTTP/3 datagrams (RFC 9297). // If a QUICConfig is set, datagram support also needs to be enabled on the QUIC layer by setting EnableDatagrams. EnableDatagrams bool // Additional HTTP/3 settings. // It is invalid to specify any settings defined by RFC 9114 (HTTP/3) and RFC 9297 (HTTP Datagrams). AdditionalSettings map[uint64]uint64 // MaxResponseHeaderBytes specifies a limit on how many response bytes are // allowed in the server's response header. // Zero means to use a default limit. MaxResponseHeaderBytes int64 // 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. DisableCompression bool // contains filtered or unexported fields }
RoundTripper implements the http.RoundTripper interface
func (*RoundTripper) Close ¶
func (r *RoundTripper) Close() error
Close closes the QUIC connections that this RoundTripper has used. It also closes the underlying UDPConn if it is not nil.
func (*RoundTripper) CloseIdleConnections ¶
func (r *RoundTripper) CloseIdleConnections()
func (*RoundTripper) RoundTripOpt ¶
func (r *RoundTripper) RoundTripOpt(req *http.Request, opt RoundTripOpt) (*http.Response, error)
RoundTripOpt is like RoundTrip, but takes options.
type Server ¶
type Server struct { // Addr optionally specifies the UDP address for the server to listen on, // in the form "host:port". // // When used by ListenAndServe and ListenAndServeTLS methods, if empty, // ":https" (port 443) is used. See net.Dial for details of the address // format. // // Otherwise, if Port is not set and underlying QUIC listeners do not // have valid port numbers, the port part is used in Alt-Svc headers set // with SetQUICHeaders. Addr string // Port is used in Alt-Svc response headers set with SetQUICHeaders. If // needed Port can be manually set when the Server is created. // // This is useful when a Layer 4 firewall is redirecting UDP traffic and // clients must use a port different from the port the Server is // listening on. Port int // TLSConfig provides a TLS configuration for use by server. It must be // set for ListenAndServe and Serve methods. TLSConfig *tls.Config // QUICConfig provides the parameters for QUIC connection created with Serve. // If nil, it uses reasonable default values. // // Configured versions are also used in Alt-Svc response header set with SetQUICHeaders. QUICConfig *quic.Config // Handler is the HTTP request handler to use. If not set, defaults to // http.NotFound. Handler http.Handler // EnableDatagrams enables support for HTTP/3 datagrams (RFC 9297). // If set to true, QUICConfig.EnableDatagrams will be set. EnableDatagrams bool // MaxHeaderBytes controls the maximum number of bytes the server will // read parsing the request HEADERS frame. It does not limit the size of // the request body. If zero or negative, http.DefaultMaxHeaderBytes is // used. MaxHeaderBytes int // AdditionalSettings specifies additional HTTP/3 settings. // It is invalid to specify any settings defined by RFC 9114 (HTTP/3) and RFC 9297 (HTTP Datagrams). AdditionalSettings map[uint64]uint64 // StreamHijacker, when set, is called for the first unknown frame parsed on a bidirectional stream. // It is called right after parsing the frame type. // If parsing the frame type fails, the error is passed to the callback. // In that case, the frame type will not be set. // Callers can either ignore the frame and return control of the stream back to HTTP/3 // (by returning hijacked false). // Alternatively, callers can take over the QUIC stream (by returning hijacked true). StreamHijacker func(FrameType, quic.ConnectionTracingID, quic.Stream, error) (hijacked bool, err error) // UniStreamHijacker, when set, is called for unknown unidirectional stream of unknown stream type. // If parsing the stream type fails, the error is passed to the callback. // In that case, the stream type will not be set. UniStreamHijacker func(StreamType, quic.ConnectionTracingID, quic.ReceiveStream, error) (hijacked bool) // IdleTimeout specifies how long until idle clients connection should be // closed. Idle refers only to the HTTP/3 layer, activity at the QUIC layer // like PING frames are not considered. // If zero or negative, there is no timeout. IdleTimeout time.Duration // ConnContext optionally specifies a function that modifies the context used for a new connection c. // The provided ctx has a ServerContextKey value. ConnContext func(ctx context.Context, c quic.Connection) context.Context Logger *slog.Logger // contains filtered or unexported fields }
Server is a HTTP/3 server.
func (*Server) Close ¶
Close the server immediately, aborting requests and sending CONNECTION_CLOSE frames to connected clients. Close in combination with ListenAndServe() (instead of Serve()) may race if it is called before a UDP socket is established.
func (*Server) CloseGracefully ¶
CloseGracefully shuts down the server gracefully. The server sends a GOAWAY frame first, then waits for either timeout to trigger, or for all running requests to complete. CloseGracefully in combination with ListenAndServe() (instead of Serve()) may race if it is called before a UDP socket is established.
func (*Server) ListenAndServe ¶
ListenAndServe listens on the UDP address s.Addr and calls s.Handler to handle HTTP/3 requests on incoming connections.
If s.Addr is blank, ":https" is used.
func (*Server) ListenAndServeTLS ¶
ListenAndServeTLS listens on the UDP address s.Addr and calls s.Handler to handle HTTP/3 requests on incoming connections.
If s.Addr is blank, ":https" is used.
func (*Server) Serve ¶
func (s *Server) Serve(conn net.PacketConn) error
Serve an existing UDP connection. It is possible to reuse the same connection for outgoing connections. Closing the server does not close the connection.
func (*Server) ServeListener ¶
func (s *Server) ServeListener(ln QUICEarlyListener) error
ServeListener serves an existing QUIC listener. Make sure you use http3.ConfigureTLSConfig to configure a tls.Config and use it to construct a http3-friendly QUIC listener. Closing the server does close the listener. ServeListener always returns a non-nil error. After Shutdown or Close, the returned error is http.ErrServerClosed.
func (*Server) ServeQUICConn ¶
ServeQUICConn serves a single QUIC connection.
func (*Server) SetQUICHeaders ¶
SetQUICHeaders can be used to set the proper headers that announce that this server supports HTTP/3. The values set by default advertise all the ports the server is listening on, but can be changed to a specific port by setting Server.Port before launching the server. If no listener's Addr().String() returns an address with a valid port, Server.Addr will be used to extract the port, if specified. For example, a server launched using ListenAndServe on an address with port 443 would set:
Alt-Svc: h3=":443"; ma=2592000
func (*Server) SetQuicHeaders
deprecated
type Settings ¶
type Settings struct { // Support for HTTP/3 datagrams (RFC 9297) EnableDatagrams bool // Extended CONNECT, RFC 9220 EnableExtendedConnect bool // Other settings, defined by the application Other map[uint64]uint64 }
Settings are HTTP/3 settings that apply to the underlying connection.
type SingleDestinationRoundTripper ¶
type SingleDestinationRoundTripper struct { Connection quic.Connection // Enable support for HTTP/3 datagrams (RFC 9297). // If a QUICConfig is set, datagram support also needs to be enabled on the QUIC layer by setting EnableDatagrams. EnableDatagrams bool // Additional HTTP/3 settings. // It is invalid to specify any settings defined by RFC 9114 (HTTP/3) and RFC 9297 (HTTP Datagrams). AdditionalSettings map[uint64]uint64 StreamHijacker func(FrameType, quic.ConnectionTracingID, quic.Stream, error) (hijacked bool, err error) UniStreamHijacker func(StreamType, quic.ConnectionTracingID, quic.ReceiveStream, error) (hijacked bool) // MaxResponseHeaderBytes specifies a limit on how many response bytes are // allowed in the server's response header. // Zero means to use a default limit. MaxResponseHeaderBytes int64 // 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. DisableCompression bool Logger *slog.Logger // contains filtered or unexported fields }
SingleDestinationRoundTripper is an HTTP/3 client doing requests to a single remote server.
func (*SingleDestinationRoundTripper) OpenRequestStream ¶
func (c *SingleDestinationRoundTripper) OpenRequestStream(ctx context.Context) (RequestStream, error)
func (*SingleDestinationRoundTripper) RoundTrip ¶
RoundTrip executes a request and returns a response
func (*SingleDestinationRoundTripper) Start ¶
func (c *SingleDestinationRoundTripper) Start() Connection