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

     1  package proxy
     2  
     3  import (
     4  	"net"
     5  	"sync"
     6  
     7  	"github.com/codingeasygo/util/proxy/http"
     8  	"github.com/codingeasygo/util/proxy/socks"
     9  	"github.com/codingeasygo/util/xio"
    10  )
    11  
    12  // Server provider http/socks combined server
    13  type Server struct {
    14  	*xio.ByteDistributeProcessor
    15  	Dialer xio.PiperDialer
    16  	HTTP   *http.Server
    17  	SOCKS  *socks.Server
    18  	waiter sync.WaitGroup
    19  }
    20  
    21  // NewServer will return new Server
    22  func NewServer(dialer xio.PiperDialer) (server *Server) {
    23  	server = &Server{
    24  		ByteDistributeProcessor: xio.NewByteDistributeProcessor(),
    25  		Dialer:                  dialer,
    26  		HTTP:                    http.NewServer(),
    27  		SOCKS:                   socks.NewServer(),
    28  		waiter:                  sync.WaitGroup{},
    29  	}
    30  	server.HTTP.Dialer = server
    31  	server.SOCKS.Dialer = server
    32  	server.AddProcessor('*', server.HTTP)
    33  	server.AddProcessor(0x05, server.SOCKS)
    34  	return
    35  }
    36  
    37  // DialPiper is xio.Piper implement
    38  func (s *Server) DialPiper(uri string, bufferSize int) (raw xio.Piper, err error) {
    39  	raw, err = s.Dialer.DialPiper(uri, bufferSize)
    40  	return
    41  }
    42  
    43  // Start wiil listen tcp on addr and run process accept to ByteDistributeProcessor
    44  func (s *Server) Start(network, addr string) (listener net.Listener, err error) {
    45  	listener, err = net.Listen(network, addr)
    46  	if err != nil {
    47  		return
    48  	}
    49  	s.waiter.Add(1)
    50  	go func() {
    51  		s.ProcAccept(listener)
    52  		s.waiter.Done()
    53  	}()
    54  	return
    55  }
    56  
    57  // Wait will wait all runner
    58  func (s *Server) Wait() {
    59  	s.waiter.Wait()
    60  }