ErrListenerClosed is returned from muxListener.Accept when the underlying listener is closed.
var ErrListenerClosed = errListenerClosed("mux: listener closed")
ErrServerClosed is returned from muxListener.Accept when mux server is closed.
var ErrServerClosed = errors.New("mux: server closed")
CMux is a multiplexer for network connections.
type CMux interface { // Match returns a net.Listener that sees (i.e., accepts) only // the connections matched by at least one of the matcher. // // The order used to call Match determines the priority of matchers. Match(...Matcher) net.Listener // MatchWithWriters returns a net.Listener that accepts only the // connections that matched by at least of the matcher writers. // // Prefer Matchers over MatchWriters, since the latter can write on the // connection before the actual handler. // // The order used to call Match determines the priority of matchers. MatchWithWriters(...MatchWriter) net.Listener // Serve starts multiplexing the listener. Serve blocks and perhaps // should be invoked concurrently within a go routine. Serve() error // Closes cmux server and stops accepting any connections on listener Close() // HandleError registers an error handler that handles listener errors. HandleError(ErrorHandler) // sets a timeout for the read of matchers SetReadTimeout(time.Duration) }
func New(l net.Listener) CMux
New instantiates a new connection multiplexer.
ErrNotMatched is returned whenever a connection is not matched by any of the matchers registered in the multiplexer.
type ErrNotMatched struct {
// contains filtered or unexported fields
}
func (e ErrNotMatched) Error() string
func (e ErrNotMatched) Temporary() bool
Temporary implements the net.Error interface.
func (e ErrNotMatched) Timeout() bool
Timeout implements the net.Error interface.
ErrorHandler handles an error and returns whether the mux should continue serving the listener.
type ErrorHandler func(error) bool
MatchWriter is a match that can also write response (say to do handshake).
type MatchWriter func(io.Writer, io.Reader) bool
func HTTP2MatchHeaderFieldPrefixSendSettings(name, valuePrefix string) MatchWriter
HTTP2MatchHeaderFieldPrefixSendSettings matches the header field prefix and writes the settings to the server. Prefer HTTP2HeaderFieldPrefix over this one, if the client does not block on receiving a SETTING frame.
func HTTP2MatchHeaderFieldSendSettings(name, value string) MatchWriter
HTTP2MatchHeaderFieldSendSettings matches the header field and writes the settings to the server. Prefer HTTP2HeaderField over this one, if the client does not block on receiving a SETTING frame.
Matcher matches a connection based on its content.
type Matcher func(io.Reader) bool
func Any() Matcher
Any is a Matcher that matches any connection.
func HTTP1() Matcher
HTTP1 parses the first line or upto 4096 bytes of the request to see if the conection contains an HTTP request.
func HTTP1Fast(extMethods ...string) Matcher
HTTP1Fast only matches the methods in the HTTP request.
This matcher is very optimistic: if it returns true, it does not mean that the request is a valid HTTP response. If you want a correct but slower HTTP1 matcher, use HTTP1 instead.
func HTTP1HeaderField(name, value string) Matcher
HTTP1HeaderField returns a matcher matching the header fields of the first request of an HTTP 1 connection.
func HTTP1HeaderFieldPrefix(name, valuePrefix string) Matcher
HTTP1HeaderFieldPrefix returns a matcher matching the header fields of the first request of an HTTP 1 connection. If the header with key name has a value prefixed with valuePrefix, this will match.
func HTTP2() Matcher
HTTP2 parses the frame header of the first frame to detect whether the connection is an HTTP2 connection.
func HTTP2HeaderField(name, value string) Matcher
HTTP2HeaderField returns a matcher matching the header fields of the first headers frame.
func HTTP2HeaderFieldPrefix(name, valuePrefix string) Matcher
HTTP2HeaderFieldPrefix returns a matcher matching the header fields of the first headers frame. If the header with key name has a value prefixed with valuePrefix, this will match.
func PrefixMatcher(strs ...string) Matcher
PrefixMatcher returns a matcher that matches a connection if it starts with any of the strings in strs.
func TLS(versions ...int) Matcher
TLS matches HTTPS requests.
By default, any TLS handshake packet is matched. An optional whitelist of versions can be passed in to restrict the matcher, for example:
TLS(tls.VersionTLS11, tls.VersionTLS12)
MuxConn wraps a net.Conn and provides transparent sniffing of connection data.
type MuxConn struct { net.Conn // contains filtered or unexported fields }
func (m *MuxConn) Read(p []byte) (int, error)
From the io.Reader documentation:
When Read encounters an error or end-of-file condition after successfully reading n > 0 bytes, it returns the number of bytes read. It may return the (non-nil) error from the same call or return the error (and n == 0) from a subsequent call. An instance of this general case is that a Reader returning a non-zero number of bytes at the end of the input stream may return either err == EOF or err == nil. The next Read should return 0, EOF.