func ProxyStream()

in terminal.go [27:62]


func ProxyStream(w http.ResponseWriter, r *http.Request, stream io.ReadWriteCloser, proxy *StreamProxy) {
	clientAddr := getClientAddr(r) // We can't know the port with confidence

	logger := log.WithFields(log.Fields{
		"clientAddr": clientAddr,
		"pkg":        "terminal",
	})

	clientConn, err := upgradeClient(w, r)
	if err != nil {
		logger.WithError(err).Error("failed to upgrade client connection to websocket")
		return
	}

	defer func() {
		err := clientConn.UnderlyingConn().Close()
		if err != nil {
			logger.WithError(err).Error("failed to close client connection")
		}

		err = stream.Close()
		if err != nil {
			logger.WithError(err).Error("failed to close stream")
		}
	}()

	client := NewIOWrapper(clientConn)

	// Regularly send ping messages to the browser to keep the websocket from
	// being timed out by intervening proxies.
	go pingLoop(client)

	if err := proxy.Serve(client, stream); err != nil {
		logger.WithError(err).Error("failed to proxy stream")
	}
}