github.com/igoogolx/clash@v1.19.8/listener/http/server.go (about)

     1  package http
     2  
     3  import (
     4  	"net"
     5  
     6  	"github.com/igoogolx/clash/common/cache"
     7  	C "github.com/igoogolx/clash/constant"
     8  )
     9  
    10  type Listener struct {
    11  	listener net.Listener
    12  	addr     string
    13  	closed   bool
    14  }
    15  
    16  // RawAddress implements C.Listener
    17  func (l *Listener) RawAddress() string {
    18  	return l.addr
    19  }
    20  
    21  // Address implements C.Listener
    22  func (l *Listener) Address() string {
    23  	return l.listener.Addr().String()
    24  }
    25  
    26  // Close implements C.Listener
    27  func (l *Listener) Close() error {
    28  	l.closed = true
    29  	return l.listener.Close()
    30  }
    31  
    32  func New(addr string, in chan<- C.ConnContext) (C.Listener, error) {
    33  	return NewWithAuthenticate(addr, in, true)
    34  }
    35  
    36  func NewWithAuthenticate(addr string, in chan<- C.ConnContext, authenticate bool) (C.Listener, error) {
    37  	l, err := net.Listen("tcp", addr)
    38  	if err != nil {
    39  		return nil, err
    40  	}
    41  
    42  	var c *cache.LruCache
    43  	if authenticate {
    44  		c = cache.New(cache.WithAge(30))
    45  	}
    46  
    47  	hl := &Listener{
    48  		listener: l,
    49  		addr:     addr,
    50  	}
    51  	go func() {
    52  		for {
    53  			conn, err := hl.listener.Accept()
    54  			if err != nil {
    55  				if hl.closed {
    56  					break
    57  				}
    58  				continue
    59  			}
    60  			go HandleConn(conn, in, c)
    61  		}
    62  	}()
    63  
    64  	return hl, nil
    65  }