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 }