in terminal.go [109:137]
func ProxyFileDescriptor(w http.ResponseWriter, r *http.Request, fd *os.File, proxy *FileDescriptorProxy) {
clientConn, err := upgradeClient(w, r)
if err != nil {
log.WithError(err).Print("Terminal: upgrading client to websocket failed")
return
}
client := NewIOWrapper(clientConn)
// Regularly send ping messages to the browser to keep the websocket from
// being timed out by intervening proxies.
go pingLoop(clientConn)
defer clientConn.UnderlyingConn().Close()
clientAddr := getClientAddr(r) // We can't know the port with confidence
serverAddr := "shell"
logEntry := log.WithFields(log.Fields{
"clientAddr": clientAddr,
"serverAddr": serverAddr,
})
logEntry.Print("Terminal: started proxying")
defer logEntry.Print("Terminal: finished proxying")
if err := proxy.Serve(fd, client, serverAddr, clientAddr); err != nil {
logEntry.WithError(err).Print("Terminal: error proxying")
}
}