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 <52862365+firstsaw...@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}