const WebSocketProtocolHeader … const ChannelWebSocketProtocol … const Base64ChannelWebSocketProtocol … type codecType … const rawCodec … const base64Codec … type ChannelType … const IgnoreChannel … const ReadChannel … const WriteChannel … const ReadWriteChannel … // IsWebSocketRequest returns true if the incoming request contains connection upgrade headers // for WebSockets. func IsWebSocketRequest(req *http.Request) bool { … } // IsWebSocketRequestWithStreamCloseProtocol returns true if the request contains headers // identifying that it is requesting a websocket upgrade with a remotecommand protocol // version that supports the "CLOSE" signal; false otherwise. func IsWebSocketRequestWithStreamCloseProtocol(req *http.Request) bool { … } // IsWebSocketRequestWithTunnelingProtocol returns true if the request contains headers // identifying that it is requesting a websocket upgrade with a tunneling protocol; // false otherwise. func IsWebSocketRequestWithTunnelingProtocol(req *http.Request) bool { … } // IgnoreReceives reads from a WebSocket until it is closed, then returns. If timeout is set, the // read and write deadlines are pushed every time a new message is received. func IgnoreReceives(ws *websocket.Conn, timeout time.Duration) { … } // handshake ensures the provided user protocol matches one of the allowed protocols. It returns // no error if no protocol is specified. func handshake(config *websocket.Config, req *http.Request, allowed []string) error { … } type ChannelProtocolConfig … // NewDefaultChannelProtocols returns a channel protocol map with the // subprotocols "", "channel.k8s.io", "base64.channel.k8s.io" and the given // channels. func NewDefaultChannelProtocols(channels []ChannelType) map[string]ChannelProtocolConfig { … } type Conn … // NewConn creates a WebSocket connection that supports a set of channels. Channels begin each // web socket message with a single byte indicating the channel number (0-N). 255 is reserved for // future use. The channel types for each channel are passed as an array, supporting the different // duplex modes. Read and Write refer to whether the channel can be used as a Reader or Writer. // // The protocols parameter maps subprotocol names to ChannelProtocols. The empty string subprotocol // name is used if websocket.Config.Protocol is empty. func NewConn(protocols map[string]ChannelProtocolConfig) *Conn { … } // SetIdleTimeout sets the interval for both reads and writes before timeout. If not specified, // there is no timeout on the connection. func (conn *Conn) SetIdleTimeout(duration time.Duration) { … } // SetWriteDeadline sets a timeout on writing to the websocket connection. The // passed "duration" identifies how far into the future the write must complete // by before the timeout fires. func (conn *Conn) SetWriteDeadline(duration time.Duration) { … } // Open the connection and create channels for reading and writing. It returns // the selected subprotocol, a slice of channels and an error. func (conn *Conn) Open(w http.ResponseWriter, req *http.Request) (string, []io.ReadWriteCloser, error) { … } func (conn *Conn) initialize(ws *websocket.Conn) { … } func (conn *Conn) handshake(config *websocket.Config, req *http.Request) error { … } func (conn *Conn) resetTimeout() { … } // closeNonThreadSafe cleans up by closing streams and the websocket // connection *without* waiting for the "ready" channel. func (conn *Conn) closeNonThreadSafe() error { … } // Close is only valid after Open has been called func (conn *Conn) Close() error { … } // protocolSupportsStreamClose returns true if the passed protocol // supports the stream close signal (currently only V5 remotecommand); // false otherwise. func protocolSupportsStreamClose(protocol string) bool { … } // protocolSupportsWebsocketTunneling returns true if the passed protocol // is a tunneled Kubernetes spdy protocol; false otherwise. func protocolSupportsWebsocketTunneling(protocol string) bool { … } // handle implements a websocket handler. func (conn *Conn) handle(ws *websocket.Conn) { … } // write multiplexes the specified channel onto the websocket func (conn *Conn) write(num byte, data []byte) (int, error) { … } type websocketChannel … // newWebsocketChannel creates a pipe for writing to a websocket. Do not write to this pipe // prior to the connection being opened. It may be no, half, or full duplex depending on // read and write. func newWebsocketChannel(conn *Conn, num byte, read, write bool) *websocketChannel { … } func (p *websocketChannel) Write(data []byte) (int, error) { … } // DataFromSocket is invoked by the connection receiver to move data from the connection // into a specific channel. func (p *websocketChannel) DataFromSocket(data []byte) (int, error) { … } func (p *websocketChannel) Read(data []byte) (int, error) { … } func (p *websocketChannel) Close() error { … }