Retry UDP queries on timeout

This commit is contained in:
Frank Denis 2020-01-29 18:14:03 +01:00
parent cd35e2e854
commit f22461374c
1 changed files with 10 additions and 7 deletions

View File

@ -366,15 +366,18 @@ func (proxy *Proxy) exchangeWithUDPServer(serverInfo *ServerInfo, sharedKey *[32
if serverInfo.RelayUDPAddr != nil {
proxy.prepareForRelay(serverInfo.UDPAddr.IP, serverInfo.UDPAddr.Port, &encryptedQuery)
}
if _, err = pc.Write(encryptedQuery); err != nil {
return nil, err
}
encryptedResponse := make([]byte, MaxDNSPacketSize)
length, err := pc.Read(encryptedResponse)
if err != nil {
return nil, err
for tries := 2; tries > 0; tries-- {
if _, err = pc.Write(encryptedQuery); err != nil {
return nil, err
}
length, err := pc.Read(encryptedResponse)
if err == nil {
encryptedResponse = encryptedResponse[:length]
break
}
dlog.Debug("Retry on timeout")
}
encryptedResponse = encryptedResponse[:length]
return proxy.Decrypt(serverInfo, sharedKey, encryptedResponse, clientNonce)
}