pkg/proxy/server.go
func NewServer(cfg ServerConfig) Server {
	s := &server{
		lg: cfg.Logger,

		from: cfg.From,
		to:   cfg.To,

		tlsInfo:     cfg.TLSInfo,
		dialTimeout: cfg.DialTimeout,

		bufferSize:    cfg.BufferSize,
		retryInterval: cfg.RetryInterval,

		readyc: make(chan struct{}),
		donec:  make(chan struct{}),
		errc:   make(chan error, 16),

		pauseAcceptc: make(chan struct{}),
		pauseTxc:     make(chan struct{}),
		pauseRxc:     make(chan struct{}),
	}

	_, fromPort, err := net.SplitHostPort(cfg.From.Host)
	if err == nil {
		s.fromPort, _ = strconv.Atoi(fromPort)
	}
	var toPort string
	_, toPort, err = net.SplitHostPort(cfg.To.Host)
	if err == nil {
		s.toPort, _ = strconv.Atoi(toPort)
	}

	if s.dialTimeout == 0 {
		s.dialTimeout = defaultDialTimeout
	}
	if s.bufferSize == 0 {
		s.bufferSize = defaultBufferSize
	}
	if s.retryInterval == 0 {
		s.retryInterval = defaultRetryInterval
	}
	if s.lg == nil {
		s.lg = defaultLogger
	}

	close(s.pauseAcceptc)
	close(s.pauseTxc)
	close(s.pauseRxc)

	if strings.HasPrefix(s.from.Scheme, "http") {
		s.from.Scheme = "tcp"
	}
	if strings.HasPrefix(s.to.Scheme, "http") {
		s.to.Scheme = "tcp"
	}

	addr := fmt.Sprintf(":%d", s.fromPort)
	if s.fromPort == 0 { // unix
		addr = s.from.Host
	}

	var ln net.Listener
	if !s.tlsInfo.Empty() {
		ln, err = transport.NewListener(addr, s.from.Scheme, &s.tlsInfo)
	} else {
		ln, err = net.Listen(s.from.Scheme, addr)
	}
	if err != nil {
		s.errc <- err
		s.Close()
		return s
	}
	s.listener = ln

	s.closeWg.Add(1)
	go s.listenAndServe()

	s.lg.Info("started proxying", zap.String("from", s.From()), zap.String("to", s.To()))
	return s
}
func NewServer(cfg ServerConfig) Server {
	s := &server{
		lg: cfg.Logger,

		from: cfg.From,
		to:   cfg.To,

		tlsInfo:     cfg.TLSInfo,
		dialTimeout: cfg.DialTimeout,

		bufferSize:    cfg.BufferSize,
		retryInterval: cfg.RetryInterval,

		readyc: make(chan struct{}),
		donec:  make(chan struct{}),
		errc:   make(chan error, 16),

		pauseAcceptc: make(chan struct{}),
		pauseTxc:     make(chan struct{}),
		pauseRxc:     make(chan struct{}),
	}

	_, fromPort, err := net.SplitHostPort(cfg.From.Host)
	if err == nil {
		s.fromPort, _ = strconv.Atoi(fromPort)
	}
	var toPort string
	_, toPort, err = net.SplitHostPort(cfg.To.Host)
	if err == nil {
		s.toPort, _ = strconv.Atoi(toPort)
	}

	if s.dialTimeout == 0 {
		s.dialTimeout = defaultDialTimeout
	}
	if s.bufferSize == 0 {
		s.bufferSize = defaultBufferSize
	}
	if s.retryInterval == 0 {
		s.retryInterval = defaultRetryInterval
	}
	if s.lg == nil {
		s.lg = defaultLogger
	}

	close(s.pauseAcceptc)
	close(s.pauseTxc)
	close(s.pauseRxc)

	if strings.HasPrefix(s.from.Scheme, "http") {
		s.from.Scheme = "tcp"
	}
	if strings.HasPrefix(s.to.Scheme, "http") {
		s.to.Scheme = "tcp"
	}

	addr := fmt.Sprintf(":%d", s.fromPort)
	if s.fromPort == 0 { // unix
		addr = s.from.Host
	}

	var ln net.Listener
	if !s.tlsInfo.Empty() {
		ln, err = transport.NewListener(addr, s.from.Scheme, &s.tlsInfo)
	} else {
		ln, err = net.Listen(s.from.Scheme, addr)
	}
	if err != nil {
		s.errc <- err
		s.Close()
		return s
	}
	s.listener = ln

	s.closeWg.Add(1)
	go s.listenAndServe()

	s.lg.Info("started proxying", zap.String("from", s.From()), zap.String("to", s.To()))
	return s
}
func NewServer ( cfg ServerConfig ) Server { s := & server { lg : cfg . Logger , from : cfg . From , to : cfg . To , tlsInfo : cfg . TLSInfo , dialTimeout : cfg . DialTimeout , bufferSize : cfg . BufferSize , retryInterval : cfg . RetryInterval , readyc : make ( chan struct { } ) , donec : make ( chan struct { } ) , errc : make ( chan error , 16 ) , pauseAcceptc : make ( chan struct { } ) , pauseTxc : make ( chan struct { } ) , pauseRxc : make ( chan struct { } ) , } _ , fromPort , err := net . SplitHostPort ( cfg . From . Host ) if err == nil { s . fromPort , _ = strconv . Atoi ( fromPort ) } var toPort string _ , toPort , err = net . SplitHostPort ( cfg . To . Host ) if err == nil { s . toPort , _ = strconv . Atoi ( toPort ) } if s . dialTimeout == 0 { s . dialTimeout = defaultDialTimeout } if s . bufferSize == 0 { s . bufferSize = defaultBufferSize } if s . retryInterval == 0 { s . retryInterval = defaultRetryInterval } if s . lg == nil { s . lg = defaultLogger } close ( s . pauseAcceptc ) close ( s . pauseTxc ) close ( s . pauseRxc ) if strings . HasPrefix ( s . from . Scheme , " " ) { s . from . Scheme = " " } if strings . HasPrefix ( s . to . Scheme , " " ) { s . to . Scheme = " " } addr := fmt . Sprintf ( " " , s . fromPort ) if s . fromPort == 0 { // unix addr = s . from . Host } var ln net . Listener if ! s . tlsInfo . Empty ( ) { ln , err = transport . NewListener ( addr , s . from . Scheme , & s . tlsInfo ) } else { ln , err = net . Listen ( s . from . Scheme , addr ) } if err != nil { s . errc <- err s . Close ( ) return s } s . listener = ln s . closeWg . Add ( 1 ) go s . listenAndServe ( ) s . lg . Info ( " " , zap . String ( " " , s . From ( ) ) , zap . String ( " " , s . To ( ) ) ) return s }
// NewServer returns a proxy implementation with no iptables/tc dependencies.
// The proxy layer overhead is <1ms.
NewServer returns a proxy implementation with no iptables / tc dependencies . The proxy layer overhead is <1ms .