private void AddToCache(DNSResponse response, string questionKey)
{
if (!m_UseCache)
{
return;
}
else if (questionKey.IsNullOrBlank())
{
throw new ApplicationException("Cannot add a DNS response to the cache with an empty question key.");
}
// Question question = response.Questions[0];
//string questionKey = question.QClass + "-" + question.QType + "-" + question.QName;
if (response.Answers.Count == 0)
{
response.Error = "DNS response had no answers.";
}
//if (response.header.RCODE != RCode.NOERROR || response.Error != null)
if (response.Error != null)
{
// Cache error responses for a short period of time to avoid overloading the server with failing DNS lookups.
logger.Debug("Caching DNS lookup failure for " + questionKey + " error was " + response.Error + ".");
lock (m_lookupFailures)
{
if (m_lookupFailures.ContainsKey(questionKey))
{
m_lookupFailures.Remove(questionKey);
}
m_lookupFailures.Add(questionKey, response);
}
}
else if(!response.Timedout && response.Answers.Count > 0)
{
// Cache non-error responses.
logger.Debug("Caching DNS lookup success for " + questionKey + ".");
lock (m_ResponseCache)
{
if (m_ResponseCache.ContainsKey(questionKey))
{
m_ResponseCache.Remove(questionKey);
}
m_ResponseCache.Add(questionKey, response);
}
}
}