| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 | package dispatcherimport (	"v2ray.com/core"	"v2ray.com/core/common/protocol/bittorrent"	"v2ray.com/core/common/protocol/http"	"v2ray.com/core/common/protocol/tls")type SniffResult interface {	Protocol() string	Domain() string}type protocolSniffer func([]byte) (SniffResult, error)type Sniffer struct {	sniffer []protocolSniffer}func NewSniffer() *Sniffer {	return &Sniffer{		sniffer: []protocolSniffer{			func(b []byte) (SniffResult, error) { return http.SniffHTTP(b) },			func(b []byte) (SniffResult, error) { return tls.SniffTLS(b) },			func(b []byte) (SniffResult, error) { return bittorrent.SniffBittorrent(b) },		},	}}var errUnknownContent = newError("unknown content")func (s *Sniffer) Sniff(payload []byte) (SniffResult, error) {	var pendingSniffer []protocolSniffer	for _, s := range s.sniffer {		result, err := s(payload)		if err == core.ErrNoClue {			pendingSniffer = append(pendingSniffer, s)			continue		}		if err == nil && result != nil {			return result, nil		}	}	if len(pendingSniffer) > 0 {		s.sniffer = pendingSniffer		return nil, core.ErrNoClue	}	return nil, errUnknownContent}
 |