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 }