dial.go 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. package net
  2. import (
  3. "crypto/tls"
  4. "net"
  5. )
  6. type dialOptions struct {
  7. proxyURL string
  8. protocol string
  9. tlsConfig *tls.Config
  10. disableCustomTLSHeadByte bool
  11. }
  12. type DialOption interface {
  13. apply(*dialOptions)
  14. }
  15. type EmptyDialOption struct{}
  16. func (EmptyDialOption) apply(*dialOptions) {}
  17. type funcDialOption struct {
  18. f func(*dialOptions)
  19. }
  20. func (fdo *funcDialOption) apply(do *dialOptions) {
  21. fdo.f(do)
  22. }
  23. func newFuncDialOption(f func(*dialOptions)) *funcDialOption {
  24. return &funcDialOption{
  25. f: f,
  26. }
  27. }
  28. func DefaultDialOptions() dialOptions {
  29. return dialOptions{
  30. protocol: "tcp",
  31. }
  32. }
  33. func WithProxyURL(proxyURL string) DialOption {
  34. return newFuncDialOption(func(do *dialOptions) {
  35. do.proxyURL = proxyURL
  36. })
  37. }
  38. func WithTLSConfig(tlsConfig *tls.Config) DialOption {
  39. return newFuncDialOption(func(do *dialOptions) {
  40. do.tlsConfig = tlsConfig
  41. })
  42. }
  43. func WithDisableCustomTLSHeadByte(disableCustomTLSHeadByte bool) DialOption {
  44. return newFuncDialOption(func(do *dialOptions) {
  45. do.disableCustomTLSHeadByte = disableCustomTLSHeadByte
  46. })
  47. }
  48. func WithProtocol(protocol string) DialOption {
  49. return newFuncDialOption(func(do *dialOptions) {
  50. do.protocol = protocol
  51. })
  52. }
  53. func DialWithOptions(addr string, opts ...DialOption) (c net.Conn, err error) {
  54. op := DefaultDialOptions()
  55. for _, opt := range opts {
  56. opt.apply(&op)
  57. }
  58. if op.proxyURL == "" {
  59. c, err = ConnectServer(op.protocol, addr)
  60. } else {
  61. c, err = ConnectServerByProxy(op.proxyURL, op.protocol, addr)
  62. }
  63. if err != nil {
  64. return nil, err
  65. }
  66. if op.tlsConfig == nil {
  67. return
  68. }
  69. c = WrapTLSClientConn(c, op.tlsConfig, op.disableCustomTLSHeadByte)
  70. return
  71. }