client_truncate.go 746 B

12345678910111213141516171819202122232425262728293031
  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. copyResponse := *response
  16. response = &copyResponse
  17. response.Truncate(maxLen)
  18. }
  19. buffer := buf.NewSize(headroom*2 + 1 + responseLen)
  20. buffer.Resize(headroom, 0)
  21. rawMessage, err := response.PackBuffer(buffer.FreeBytes())
  22. if err != nil {
  23. buffer.Release()
  24. return nil, err
  25. }
  26. buffer.Truncate(len(rawMessage))
  27. return buffer, nil
  28. }