Diff

net/dns.lua @ 6464:737c81bd898e

Merge 0.9->0.10
author Kim Alvefur <zash@zash.se>
date Sun, 05 Oct 2014 15:37:21 +0200
parent 6312:1940a014aeca
parent 6463:460584257cc9
child 6510:8273236a995f
line wrap: on
line diff
--- a/net/dns.lua	Sun Oct 05 15:36:19 2014 +0200
+++ b/net/dns.lua	Sun Oct 05 15:37:21 2014 +0200
@@ -135,17 +135,19 @@
 
 local function prune(rrs, time, soft)    -- - - - - - - - - - - - - - -  prune
 	time = time or socket.gettime();
-	for i,rr in pairs(rrs) do
+	for i,rr in ipairs(rrs) do
 		if rr.tod then
 			-- rr.tod = rr.tod - 50    -- accelerated decripitude
 			rr.ttl = math.floor(rr.tod - time);
 			if rr.ttl <= 0 then
+				rrs[rr[rr.type:lower()]] = nil;
 				table.remove(rrs, i);
 				return prune(rrs, time, soft); -- Re-iterate
 			end
 		elseif soft == 'soft' then    -- What is this?  I forget!
 			assert(rr.ttl == 0);
-			rrs[i] = nil;
+			rrs[rr[rr.type:lower()]] = nil;
+			table.remove(rrs, i);
 		end
 	end
 end
@@ -188,7 +190,7 @@
 local rrs_metatable = {};    -- - - - - - - - - - - - - - - - - -  rrs_metatable
 function rrs_metatable.__tostring(rrs)
 	local t = {};
-	for i,rr in pairs(rrs) do
+	for i,rr in ipairs(rrs) do
 		append(t, tostring(rr)..'\n');
 	end
 	return table.concat(t);
@@ -681,7 +683,10 @@
 	self.cache = self.cache or setmetatable({}, cache_metatable);
 	local rrs = get(self.cache, qclass, type, qname) or
 		set(self.cache, qclass, type, qname, setmetatable({}, rrs_metatable));
-	append(rrs, rr);
+	if not rrs[rr[qtype:lower()]] then
+		rrs[rr[qtype:lower()]] = true;
+		append(rrs, rr);
+	end
 
 	if type == 'MX' then self.unsorted[rrs] = true; end
 end