Files
threshold/internal/servers/worker/tcp_proxy.go
T
Todd Knight 33e7b4538e WorkerCoordination and GetSession API refactoring (#354)
* Possible api changes.

* Worker API update.

* Updating import alias name.

* Moving session down a level as a member of the GetSessionResponse.

* Marshal the auth flag into the GetSessionResponse proto instead of the session.
2020-09-12 21:54:18 -07:00

40 lines
1.1 KiB
Go

package worker
import (
"context"
"io"
"net"
"sync"
pb "github.com/hashicorp/boundary/internal/gen/controller/api/resources/sessions"
"nhooyr.io/websocket"
)
func (w *Worker) handleTcpProxyV1(jobCtx context.Context, conn *websocket.Conn, jobInfo *pb.Session) {
remoteConn, err := net.Dial("tcp", jobInfo.Endpoint)
if err != nil {
w.logger.Error("error dialing endpoint", "error", err, "endpoint", jobInfo.Endpoint)
conn.Close(websocket.StatusInternalError, "endpoint-dialing")
return
}
// Assert this for better Go 1.11 splice support
tcpRemoteConn := remoteConn.(*net.TCPConn)
// Get a wrapped net.Conn so we can use io.Copy
netConn := websocket.NetConn(jobCtx, conn, websocket.MessageBinary)
connWg := new(sync.WaitGroup)
connWg.Add(2)
go func() {
defer connWg.Done()
_, err := io.Copy(netConn, tcpRemoteConn)
w.logger.Debug("copy from client to endpoint done", "error", err)
}()
go func() {
defer connWg.Done()
_, err := io.Copy(tcpRemoteConn, netConn)
w.logger.Debug("copy from endpoint to client done", "error", err)
}()
connWg.Wait()
}