You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@apisix.apache.org by me...@apache.org on 2020/10/17 05:45:05 UTC

[apisix] branch master updated: feat: In dns parse, when the parameter `resolvers` is empty, the local dns is used as `resolvers` by default (#2424)

This is an automated email from the ASF dual-hosted git repository.

membphis pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/apisix.git


The following commit(s) were added to refs/heads/master by this push:
     new d1729c0  feat: In dns parse, when the parameter `resolvers` is empty, the local dns is used as `resolvers` by default  (#2424)
d1729c0 is described below

commit d1729c0af3bc416a88904568b4d2718c99a1982d
Author: Firstsawyou <52...@users.noreply.github.com>
AuthorDate: Sat Oct 17 13:44:53 2020 +0800

    feat: In dns parse, when the parameter `resolvers` is empty, the local dns is used as `resolvers` by default  (#2424)
    
    fix #2422
---
 apisix/core/utils.lua      | 10 ++++++++--
 apisix/init.lua            |  4 +++-
 t/core/utils.t             | 47 ++++++++++++++++++++++++++++++++++++++++++++++
 t/node/upstream-node-dns.t | 16 ++++++++--------
 4 files changed, 66 insertions(+), 11 deletions(-)

diff --git a/apisix/core/utils.lua b/apisix/core/utils.lua
index 9e8fc1e..e29784f 100644
--- a/apisix/core/utils.lua
+++ b/apisix/core/utils.lua
@@ -69,7 +69,8 @@ function _M.split_uri(uri)
 end
 
 
-local function dns_parse(resolvers, domain)
+local function dns_parse(domain, resolvers)
+    resolvers = resolvers or _M.resolvers
     local r, err = resolver:new{
         nameservers = table.clone(resolvers),
         retrans = 5,  -- 5 retransmissions on receive timeout
@@ -100,11 +101,16 @@ local function dns_parse(resolvers, domain)
         return nil, "unsupport DNS answer"
     end
 
-    return dns_parse(resolvers, answer.cname)
+    return dns_parse(answer.cname, resolvers)
 end
 _M.dns_parse = dns_parse
 
 
+function _M.set_resolver(resolvers)
+    _M.resolvers = resolvers
+end
+
+
 local function rfind_char(s, ch, idx)
     local b = str_byte(ch)
     for i = idx or #s, 1, -1 do
diff --git a/apisix/init.lua b/apisix/init.lua
index 3beec45..de51cd3 100644
--- a/apisix/init.lua
+++ b/apisix/init.lua
@@ -45,6 +45,7 @@ local ver_header    = "APISIX/" .. core.version.VERSION
 
 local function parse_args(args)
     dns_resolver = args and args["dns_resolver"]
+    core.utils.set_resolver(dns_resolver)
     core.log.info("dns resolver", core.json.delay_encode(dns_resolver, true))
 end
 
@@ -177,7 +178,7 @@ end
 
 
 local function parse_domain(host)
-    local ip_info, err = core.utils.dns_parse(dns_resolver, host)
+    local ip_info, err = core.utils.dns_parse(host)
     if not ip_info then
         core.log.error("failed to parse domain: ", host, ", error: ",err)
         return nil, err
@@ -219,6 +220,7 @@ local function parse_domain_for_nodes(nodes)
     return new_nodes
 end
 
+
 local function compare_upstream_node(old_t, new_t)
     if type(old_t) ~= "table" then
         return false
diff --git a/t/core/utils.t b/t/core/utils.t
index 9c19f29..25b0419 100644
--- a/t/core/utils.t
+++ b/t/core/utils.t
@@ -68,3 +68,50 @@ qr/random seed \d+\ntwice: false/
 GET /t
 --- no_error_log
 [error]
+
+
+
+=== TEST 3: specify resolvers
+--- config
+    location /t {
+        content_by_lua_block {
+            local core = require("apisix.core")
+            local resolvers = {"8.8.8.8"}
+            core.utils.set_resolver(resolvers)
+            local ip_info, err = core.utils.dns_parse("github.com", resolvers)
+            if not ip_info then
+                core.log.error("failed to parse domain: ", host, ", error: ",err)
+            end
+            ngx.say(core.json.encode(ip_info))
+        }
+    }
+--- request
+GET /t
+--- response_body eval
+qr/"address":.+,"name":"github.com"/
+--- no_error_log
+[error]
+
+
+
+=== TEST 4: default resolvers
+--- config
+    location /t {
+        content_by_lua_block {
+            local core = require("apisix.core")
+            local ip_info, err = core.utils.dns_parse("github.com")
+            if not ip_info then
+                core.log.error("failed to parse domain: ", host, ", error: ",err)
+            end
+            core.log.info("ip_info: ", core.json.encode(ip_info))
+            ngx.say("resolvers: ", core.json.encode(core.utils.resolvers))
+        }
+    }
+--- request
+GET /t
+--- response_body
+resolvers: ["8.8.8.8","114.114.114.114"]
+--- error_log eval
+qr/"address":.+,"name":"github.com"/
+--- no_error_log
+[error]
diff --git a/t/node/upstream-node-dns.t b/t/node/upstream-node-dns.t
index ef15dc2..b539873 100644
--- a/t/node/upstream-node-dns.t
+++ b/t/node/upstream-node-dns.t
@@ -79,7 +79,7 @@ passed
     apisix.http_init()
 
     local utils = require("apisix.core.utils")
-    utils.dns_parse = function (resolvers, domain)  -- mock: DNS parser
+    utils.dns_parse = function (domain, resolvers)  -- mock: DNS parser
         if domain == "test.com" then
             return {address = "127.0.0.2"}
         end
@@ -104,7 +104,7 @@ hello world
 
     local utils = require("apisix.core.utils")
     local count = 0
-    utils.dns_parse = function (resolvers, domain)  -- mock: DNS parser
+    utils.dns_parse = function (domain, resolvers)  -- mock: DNS parser
         count = count + 1
 
         if domain == "test.com" then
@@ -192,7 +192,7 @@ passed
     apisix.http_init()
 
     local utils = require("apisix.core.utils")
-    utils.dns_parse = function (resolvers, domain)  -- mock: DNS parser
+    utils.dns_parse = function (domain, resolvers)  -- mock: DNS parser
         if domain == "test.com" or domain == "test2.com" then
             return {address = "127.0.0.2"}
         end
@@ -217,7 +217,7 @@ hello world
 
     local utils = require("apisix.core.utils")
     local count = 0
-    utils.dns_parse = function (resolvers, domain)  -- mock: DNS parser
+    utils.dns_parse = function (domain, resolvers)  -- mock: DNS parser
         count = count + 1
 
         if domain == "test.com" or domain == "test2.com" then
@@ -338,7 +338,7 @@ passed
 
     local utils = require("apisix.core.utils")
     local count = 0
-    utils.dns_parse = function (resolvers, domain)  -- mock: DNS parser
+    utils.dns_parse = function (domain, resolvers)  -- mock: DNS parser
         count = count + 1
 
         if domain == "test.com" then
@@ -425,7 +425,7 @@ passed
 
     local utils = require("apisix.core.utils")
     local count = 0
-    utils.dns_parse = function (resolvers, domain)  -- mock: DNS parser
+    utils.dns_parse = function (domain, resolvers)  -- mock: DNS parser
         count = count + 1
 
         if domain == "test.com" or domain == "test2.com" then
@@ -487,7 +487,7 @@ proxy request to 127.0.0.5:1980
 
     local utils = require("apisix.core.utils")
     local count = 1
-    utils.dns_parse = function (resolvers, domain)  -- mock: DNS parser
+    utils.dns_parse = function (domain, resolvers)  -- mock: DNS parser
         if domain == "test.com" or domain == "test2.com" then
             return {address = "127.0.0.1"}
         end
@@ -579,7 +579,7 @@ passed
 
     local utils = require("apisix.core.utils")
     local count = 0
-    utils.dns_parse = function (resolvers, domain)  -- mock: DNS parser
+    utils.dns_parse = function (domain, resolvers)  -- mock: DNS parser
         count = count + 1
         if domain == "test.com" or domain == "test2.com" then
             return {address = "127.0.0." .. count}