inline truncateResponse

This commit is contained in:
Matthias Radestock committed 2015-08-20 19:55:19 +01:00
1 parent 7c7c302920
commit 322441d5c8
2 files changed
+8 -15

No files matched your search

+3 -9
View File
@@ -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 {
+5 -6
View File
@@ -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)
}
}