sniff.go 882 B

123456789101112131415161718192021222324252627282930313233343536
  1. package sniff
  2. import (
  3. "context"
  4. "io"
  5. "os"
  6. "github.com/sagernet/sing-box/adapter"
  7. )
  8. type (
  9. StreamSniffer = func(ctx context.Context, reader io.Reader) (*adapter.InboundContext, error)
  10. PacketSniffer = func(ctx context.Context, packet []byte) (*adapter.InboundContext, error)
  11. )
  12. func PeekStream(ctx context.Context, reader io.Reader, sniffers ...StreamSniffer) (*adapter.InboundContext, error) {
  13. for _, sniffer := range sniffers {
  14. sniffMetadata, err := sniffer(ctx, reader)
  15. if err != nil {
  16. return nil, err
  17. }
  18. return sniffMetadata, nil
  19. }
  20. return nil, os.ErrInvalid
  21. }
  22. func PeekPacket(ctx context.Context, packet []byte, sniffers ...PacketSniffer) (*adapter.InboundContext, error) {
  23. for _, sniffer := range sniffers {
  24. sniffMetadata, err := sniffer(ctx, packet)
  25. if err != nil {
  26. return nil, err
  27. }
  28. return sniffMetadata, nil
  29. }
  30. return nil, os.ErrInvalid
  31. }