Retry over TCP on UDP timeouts

This commit is contained in:
Frank Denis 2020-03-25 17:45:59 +01:00
parent 4fe5929720
commit dd37eaed7c
1 changed files with 6 additions and 0 deletions

View File

@ -481,7 +481,13 @@ func (proxy *Proxy) processIncomingQuery(clientProto string, serverProto string,
serverInfo.noticeBegin(proxy)
if serverProto == "udp" {
response, err = proxy.exchangeWithUDPServer(serverInfo, sharedKey, encryptedQuery, clientNonce)
retryOverTCP := false
if err == nil && len(response) >= MinDNSPacketSize && response[2]&0x02 == 0x02 {
retryOverTCP = true
} else if neterr, ok := err.(net.Error); ok && neterr.Timeout() {
retryOverTCP = true
}
if retryOverTCP {
serverProto = "tcp"
sharedKey, encryptedQuery, clientNonce, err = proxy.Encrypt(serverInfo, query, serverProto)
if err != nil {