Forwarding plugin: retry over TCP if a truncated response is received
dns.Exchange() doesn't do it automatically. Fixes #1178
This commit is contained in:
parent
170c690996
commit
63d28fc9b2
|
@ -89,10 +89,18 @@ func (plugin *PluginForward) Eval(pluginsState *PluginsState, msg *dns.Msg) erro
|
||||||
}
|
}
|
||||||
server := servers[rand.Intn(len(servers))]
|
server := servers[rand.Intn(len(servers))]
|
||||||
pluginsState.serverName = server
|
pluginsState.serverName = server
|
||||||
respMsg, err := dns.Exchange(msg, server)
|
client := dns.Client{Net: "udp"}
|
||||||
|
respMsg, _, err := client.Exchange(msg, server)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
if respMsg.Truncated {
|
||||||
|
client.Net = "tcp"
|
||||||
|
respMsg, _, err = client.Exchange(msg, server)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
if edns0 := respMsg.IsEdns0(); edns0 == nil || !edns0.Do() {
|
if edns0 := respMsg.IsEdns0(); edns0 == nil || !edns0.Do() {
|
||||||
respMsg.AuthenticatedData = false
|
respMsg.AuthenticatedData = false
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue