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  }