github.com/codingeasygo/util@v0.0.0-20231206062002-1ce2f004b7d9/xnet/transport.go (about) 1 package xnet 2 3 import ( 4 "io" 5 "net/url" 6 ) 7 8 type Transporter interface { 9 Transport(conn io.ReadWriteCloser, remote string) (err error) 10 } 11 12 func transportCopy(a, b io.ReadWriteCloser) (aerr, berr error) { 13 go func() { 14 _, berr = io.Copy(a, b) 15 a.Close() 16 b.Close() 17 }() 18 _, aerr = io.Copy(b, a) 19 a.Close() 20 b.Close() 21 return 22 } 23 24 func (w *WebsocketDialer) Transport(conn io.ReadWriteCloser, remote string) (err error) { 25 raw, err := w.Dial(remote) 26 if err != nil { 27 conn.Close() 28 return 29 } 30 aerr, berr := transportCopy(conn, raw) 31 if aerr != nil { 32 err = aerr 33 } else { 34 err = berr 35 } 36 return 37 } 38 39 func (d RawDialerF) Transport(conn io.ReadWriteCloser, remote string) (err error) { 40 u, err := url.Parse(remote) 41 if err != nil { 42 conn.Close() 43 return 44 } 45 raw, err := d.Dial(u.Scheme, u.Host) 46 if err != nil { 47 conn.Close() 48 return 49 } 50 aerr, berr := transportCopy(conn, raw) 51 if aerr != nil { 52 err = aerr 53 } else { 54 err = berr 55 } 56 return 57 }