| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 | 
							- package dispatcher
 
- import (
 
- 	"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
 
- }
 
 
  |