client_truncate.go 720 B

123456789101112131415161718192021222324252627282930
  1. package dns
  2. import (
  3. "github.com/sagernet/sing/common/buf"
  4. "github.com/miekg/dns"
  5. )
  6. func TruncateDNSMessage(request *dns.Msg, response *dns.Msg, headroom int) (*buf.Buffer, error) {
  7. maxLen := 512
  8. if edns0Option := request.IsEdns0(); edns0Option != nil {
  9. if udpSize := int(edns0Option.UDPSize()); udpSize > 512 {
  10. maxLen = udpSize
  11. }
  12. }
  13. responseLen := response.Len()
  14. if responseLen > maxLen {
  15. response = response.Copy()
  16. response.Truncate(maxLen)
  17. }
  18. buffer := buf.NewSize(headroom*2 + 1 + responseLen)
  19. buffer.Resize(headroom, 0)
  20. rawMessage, err := response.PackBuffer(buffer.FreeBytes())
  21. if err != nil {
  22. buffer.Release()
  23. return nil, err
  24. }
  25. buffer.Truncate(len(rawMessage))
  26. return buffer, nil
  27. }