inline truncateResponse
This commit is contained in:
1 parent
7c7c302920
commit
322441d5c8
2 files changed
+8
-15
No files matched your search
+3
-9
@@ -247,19 +247,12 @@ func (h *handler) makeResponse(req *dns.Msg, answers []dns.RR) *dns.Msg {
|
||||
response.RecursionAvailable = true
|
||||
response.Authoritative = true
|
||||
response.Answer = answers
|
||||
h.truncateResponse(req, response)
|
||||
return response
|
||||
}
|
||||
|
||||
func (h *handler) truncateResponse(req, response *dns.Msg) {
|
||||
maxSize := h.getMaxResponseSize(req)
|
||||
if len(response.Answer) <= 1 || maxSize <= 0 {
|
||||
return
|
||||
return response
|
||||
}
|
||||
|
||||
// take a copy of answers, as we're going to mutate response
|
||||
answers := response.Answer
|
||||
|
||||
// search for smallest i that is too big
|
||||
i := sort.Search(len(response.Answer), func(i int) bool {
|
||||
// return true if too big
|
||||
@@ -268,11 +261,12 @@ func (h *handler) truncateResponse(req, response *dns.Msg) {
|
||||
})
|
||||
if i == len(answers) {
|
||||
response.Answer = answers
|
||||
return
|
||||
return response
|
||||
}
|
||||
|
||||
response.Answer = answers[:i]
|
||||
response.Truncated = true
|
||||
return response
|
||||
}
|
||||
|
||||
func (h *handler) getMaxResponseSize(req *dns.Msg) int {
|
||||
|
||||
@@ -83,18 +83,17 @@ func TestTruncateResponse(t *testing.T) {
|
||||
}
|
||||
|
||||
for i := 0; i < 10000; i++ {
|
||||
// generate a random msg
|
||||
response := &dns.Msg{}
|
||||
// generate a random answer set
|
||||
numAnswers := 40 + rand.Intn(200)
|
||||
response.Answer = make([]dns.RR, numAnswers)
|
||||
answers := make([]dns.RR, numAnswers)
|
||||
for j := 0; j < numAnswers; j++ {
|
||||
response.Answer[j] = &dns.A{Hdr: header, A: address.Address(j).IP4()}
|
||||
answers[j] = &dns.A{Hdr: header, A: address.Address(j).IP4()}
|
||||
}
|
||||
|
||||
// pick a random max size, truncate response to that, check it
|
||||
maxSize := 512 + rand.Intn(response.Len()-512)
|
||||
maxSize := 512 + rand.Intn(2*512)
|
||||
h := handler{maxResponseSize: maxSize}
|
||||
h.truncateResponse(&dns.Msg{}, response)
|
||||
response := h.makeResponse(&dns.Msg{}, answers)
|
||||
require.True(t, response.Len() <= maxSize)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user