Skip to content

Commit f5e8dd5

Browse files
committed
Improve truncating
1 parent a4a1dd8 commit f5e8dd5

File tree

1 file changed

+17
-25
lines changed

1 file changed

+17
-25
lines changed

client_truncate.go

Lines changed: 17 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,29 @@
11
package dns
22

3-
import "github.com/miekg/dns"
3+
import (
4+
"github.com/sagernet/sing/common/buf"
45

5-
func TruncateDNSMessage(request *dns.Msg, response *dns.Msg) (*dns.Msg, int) {
6+
"github.com/miekg/dns"
7+
)
8+
9+
func TruncateDNSMessage(request *dns.Msg, response *dns.Msg, headroom int) (*buf.Buffer, error) {
610
maxLen := 512
711
if edns0Option := request.IsEdns0(); edns0Option != nil {
8-
if udpSize := int(edns0Option.UDPSize()); udpSize > 0 {
12+
if udpSize := int(edns0Option.UDPSize()); udpSize > 512 {
913
maxLen = udpSize
1014
}
1115
}
12-
return truncateDNSMessage(response, maxLen)
13-
}
14-
15-
func truncateDNSMessage(response *dns.Msg, maxLen int) (*dns.Msg, int) {
1616
responseLen := response.Len()
17-
if responseLen <= maxLen {
18-
return response, responseLen
19-
}
20-
newResponse := *response
21-
response = &newResponse
22-
response.Compress = true
23-
responseLen = response.Len()
24-
if responseLen <= maxLen {
25-
return response, responseLen
26-
}
27-
for len(response.Answer) > 0 && responseLen > maxLen {
28-
response.Answer = response.Answer[:len(response.Answer)-1]
29-
response.Truncated = true
30-
responseLen = response.Len()
31-
}
3217
if responseLen > maxLen {
33-
response.Ns = nil
34-
response.Extra = nil
18+
response.Truncate(maxLen)
19+
}
20+
buffer := buf.NewSize(headroom*2 + 1 + responseLen)
21+
buffer.Resize(headroom, 0)
22+
rawMessage, err := response.PackBuffer(buffer.FreeBytes())
23+
if err != nil {
24+
buffer.Release()
25+
return nil, err
3526
}
36-
return response, response.Len()
27+
buffer.Truncate(len(rawMessage))
28+
return buffer, nil
3729
}

0 commit comments

Comments
 (0)