github.com/codingeasygo/util@v0.0.0-20231206062002-1ce2f004b7d9/xnet/dialer.go (about)

     1  package xnet
     2  
     3  import (
     4  	"io"
     5  	"net"
     6  	"net/url"
     7  )
     8  
     9  // Dialer is interface for dial raw connect by string
    10  type Dialer interface {
    11  	Dial(remote string) (raw io.ReadWriteCloser, err error)
    12  }
    13  
    14  // RawDialer is an interface to dial raw conenction
    15  type RawDialer interface {
    16  	Dial(network, address string) (net.Conn, error)
    17  }
    18  
    19  // RawDialerF is an the implementation of RawDialer by func
    20  type RawDialerF func(network, address string) (net.Conn, error)
    21  
    22  // Dial dial to remote by func
    23  func (d RawDialerF) Dial(network, address string) (raw net.Conn, err error) {
    24  	raw, err = d(network, address)
    25  	return
    26  }
    27  
    28  type RawDialerWrapper struct {
    29  	RawDialer
    30  }
    31  
    32  func NewRawDialerWrapper(raw RawDialer) (dialer *RawDialerWrapper) {
    33  	dialer = &RawDialerWrapper{
    34  		RawDialer: raw,
    35  	}
    36  	return
    37  }
    38  
    39  func NewNetDailer() (dialer *RawDialerWrapper) {
    40  	dialer = NewRawDialerWrapper(&net.Dialer{})
    41  	return
    42  }
    43  
    44  func (w RawDialerWrapper) Dial(remote string) (raw io.ReadWriteCloser, err error) {
    45  	remoteURI, err := url.Parse(remote)
    46  	if err != nil {
    47  		return
    48  	}
    49  	network := remoteURI.Scheme
    50  	address := remoteURI.Host
    51  	if len(remoteURI.Port()) < 1 {
    52  		switch network {
    53  		case "https":
    54  			address += ":443"
    55  			network = "tcp"
    56  		case "http":
    57  			address += ":80"
    58  			network = "tcp"
    59  		}
    60  	}
    61  	raw, err = w.RawDialer.Dial(network, address)
    62  	return
    63  }