aboutsummaryrefslogtreecommitdiff
path: root/plugin/forward/truncated.go
blob: f9bd464d1d61f879568653f77dff57aeb622d2a4 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package forward

import (
	"github.com/coredns/coredns/request"

	"github.com/miekg/dns"
)

// truncated looks at the error and if truncated return a nil errror
// and a possible reconstructed dns message if that was nil.
func truncated(state request.Request, ret *dns.Msg, err error) (*dns.Msg, error) {
	// If you query for instance ANY isc.org; you get a truncated query back which miekg/dns fails to unpack
	// because the RRs are not finished. The returned message can be useful or useless. Return the original
	// query with some header bits set that they should retry with TCP.
	if err != dns.ErrTruncated {
		return ret, err
	}

	// We may or may not have something sensible... if not reassemble something to send to the client.
	m := ret
	if ret == nil {
		m = new(dns.Msg)
		m.SetReply(state.Req)
		m.Truncated = true
		m.Authoritative = true
		m.Rcode = dns.RcodeSuccess
	}
	return m, nil
}