net.dns, mod_s2s: Add chasing of CNAMEs to net.dns and remove it from mod_s2s
authorKim Alvefur <zash@zash.se>
Fri, 24 Apr 2015 12:14:01 +0000 (14:14 +0200)
committerKim Alvefur <zash@zash.se>
Fri, 24 Apr 2015 12:14:01 +0000 (14:14 +0200)
net/dns.lua
plugins/mod_s2s/s2sout.lib.lua

index 13417ceeaa368a34b7a35fb7e6bea5f81ef1c077..28cb44190eced9d73df3aaabbd582ca633c7eb57 100644 (file)
@@ -694,15 +694,20 @@ local function comp_mx(a, b)    -- - - - - - - - - - - - - - - - - - - comp_mx
 end
 
 
-function resolver:peek (qname, qtype, qclass)    -- - - - - - - - - - - -  peek
+function resolver:peek (qname, qtype, qclass, n)    -- - - - - - - - - - - -  peek
        qname, qtype, qclass = standardize(qname, qtype, qclass);
        local rrs = get(self.cache, qclass, qtype, qname);
-       if not rrs then return nil; end
+       if not rrs then
+               if n then if n <= 0 then return end else n = 3 end
+               rrs = get(self.cache, qclass, "CNAME", qname);
+               if not (rrs and rrs[1]) then return end
+               return self:peek(rrs[1].cname, qtype, qclass, n - 1);
+       end
        if prune(rrs, socket.gettime()) and qtype == '*' or not next(rrs) then
                set(self.cache, qclass, qtype, qname, nil);
                return nil;
        end
-       if self.unsorted[rrs] then table.sort (rrs, comp_mx); end
+       if self.unsorted[rrs] then table.sort (rrs, comp_mx); self.unsorted[rrs] = nil; end
        return rrs;
 end
 
index b24faf8553cf84d5dd173cd674429766cc880052..67b8fd0f4977bdc61b7a8aaa7e60c99908167b45 100644 (file)
@@ -169,18 +169,6 @@ function s2sout.try_connect(host_session, connect_host, connect_port, err)
                        handle4 = adns.lookup(function (reply, err)
                                handle4 = nil;
 
-                               -- COMPAT: This is a compromise for all you CNAME-(ab)users :)
-                               if not (reply and reply[#reply] and reply[#reply].a) then
-                                       local count = max_dns_depth;
-                                       reply = dns.peek(connect_host, "CNAME", "IN");
-                                       while count > 0 and reply and reply[#reply] and not reply[#reply].a and reply[#reply].cname do
-                                               log("debug", "Looking up %s (DNS depth is %d)", tostring(reply[#reply].cname), count);
-                                               reply = dns.peek(reply[#reply].cname, "A", "IN") or dns.peek(reply[#reply].cname, "CNAME", "IN");
-                                               count = count - 1;
-                                       end
-                               end
-                               -- end of CNAME resolving
-
                                if reply and reply[#reply] and reply[#reply].a then
                                        for _, ip in ipairs(reply) do
                                                log("debug", "DNS reply for %s gives us %s", connect_host, ip.a);