예제 #1
0
        private static IReadOnlyList <DnsResourceRecord> FilterExpiredRecords(DnsResourceRecordType type, IReadOnlyList <DnsResourceRecord> records, bool serveStale, bool filterSpecialCacheRecords)
        {
            if (records.Count == 1)
            {
                DnsResourceRecord record = records[0];

                if (record.IsExpired(serveStale))
                {
                    return(Array.Empty <DnsResourceRecord>()); //record expired
                }
                if (filterSpecialCacheRecords)
                {
                    if ((record.RDATA is DnsCache.DnsNXRecord) || (record.RDATA is DnsCache.DnsEmptyRecord) || (record.RDATA is DnsCache.DnsFailureRecord))
                    {
                        return(Array.Empty <DnsResourceRecord>()); //special cache record
                    }
                }

                return(records);
            }

            List <DnsResourceRecord> newRecords = new List <DnsResourceRecord>(records.Count);

            foreach (DnsResourceRecord record in records)
            {
                if (record.IsExpired(serveStale))
                {
                    continue; //record expired
                }
                if (filterSpecialCacheRecords)
                {
                    if ((record.RDATA is DnsCache.DnsNXRecord) || (record.RDATA is DnsCache.DnsEmptyRecord) || (record.RDATA is DnsCache.DnsFailureRecord))
                    {
                        continue; //special cache record
                    }
                }

                newRecords.Add(record);
            }

            if (newRecords.Count > 1)
            {
                switch (type)
                {
                case DnsResourceRecordType.A:
                case DnsResourceRecordType.AAAA:
                    newRecords.Shuffle();     //shuffle records to allow load balancing
                    break;
                }
            }

            return(newRecords);
        }