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")
}
}