package main import ( "converge/pkg/iowrappers" "converge/pkg/websocketutil" "crypto/tls" "flag" "fmt" "github.com/gorilla/websocket" "log" "net" "net/http" "os" "time" ) func closeConnection(conn net.Conn) { if tcpConn, ok := conn.(*net.TCPConn); ok { tcpConn.SetLinger(0) } _ = conn.Close() } func handleConnection(conn net.Conn, wsURL string, insecure bool) { defer closeConnection(conn) log.Printf("Connecting to '%s'\n", wsURL) dialer := websocket.Dialer{ Proxy: http.ProxyFromEnvironment, HandshakeTimeout: 45 * time.Second, } if insecure { dialer.TLSClientConfig = &tls.Config{InsecureSkipVerify: true} } _wsConn, _, err := dialer.Dial(wsURL, nil) if err != nil { log.Println("WebSocket connection error:", err) return } _wsConn.SetReadDeadline(time.Time{}) _wsConn.SetWriteDeadline(time.Time{}) wsConn := websocketutil.NewWebSocketConn(_wsConn) defer wsConn.Close() iowrappers.SynchronizeStreams(wsConn, conn) } func main() { usage := "Usage: tcptows [options] ws[s]://[:port]/client/\n" + "\n" + "Here is the rendez-vous id of a continuous integratio job\n" insecure := flag.Bool("insecure", false, "allow invalid certificates") flag.Usage = func() { fmt.Fprintln(os.Stderr, usage) flag.PrintDefaults() } flag.Parse() fmt.Println("Narg ", flag.NArg()) if flag.NArg() != 2 { flag.Usage() os.Exit(1) } tcpPort := flag.Arg(0) wsURL := flag.Arg(1) listener, err := net.Listen("tcp", ":"+tcpPort) if err != nil { log.Fatal(err) } defer listener.Close() log.Printf("TCP server listening on port %s\n", tcpPort) log.Printf("Forwarding connections to WebSocket server at %s\n", wsURL) for { conn, err := listener.Accept() if err != nil { log.Println(err) continue } go handleConnection(conn, wsURL, *insecure) } }