From fb2fd43e0805a3633c090bbeb6d9bc06d22cf7d1 Mon Sep 17 00:00:00 2001 From: Dhruv Sarawagi <62890722+dhruvd11@users.noreply.github.com> Date: Thu, 12 Aug 2021 15:55:19 +0530 Subject: [PATCH] feat: add support for local routes in upstream url (#3) Co-authored-by: Dhruv Sarawagi --- kong/plugins/advanced-router/handler.lua | 22 ++++++++++++++++++++-- kong/plugins/advanced-router/io.lua | 3 ++- kong/plugins/advanced-router/utils.lua | 10 ++++++++++ 3 files changed, 32 insertions(+), 3 deletions(-) diff --git a/kong/plugins/advanced-router/handler.lua b/kong/plugins/advanced-router/handler.lua index 7180527..d1610ff 100644 --- a/kong/plugins/advanced-router/handler.lua +++ b/kong/plugins/advanced-router/handler.lua @@ -2,10 +2,12 @@ local inspect = require("inspect") local cjson_safe = require "cjson.safe" local url = require "socket.url" local date = require "date" +local pl_tablex = require "pl.tablex" local get_io_data = require("kong.plugins.advanced-router.io").get_io_data local extract = require("kong.plugins.advanced-router.utils").extract local replaceStringEnvVariables = require("kong.plugins.advanced-router.utils").replaceStringEnvVariables +local build_url = require("kong.plugins.advanced-router.utils").build_url local AdvancedRouterHandler = {} @@ -14,6 +16,17 @@ AdvancedRouterHandler.VERSION = "1.0.0" local boolean_functions = {} +local kong_proxy_port + +function get_poxy_port() + local http_listener = pl_tablex.filter(kong.configuration.proxy_listeners, function(x) + if not x.ssl then + return true + end + end) + return http_listener[1]['port'] +end + function get_current_timestamp_utc() return date.diff(date(true), date(1970, 1, 1)):spanseconds() end @@ -30,7 +43,8 @@ function generate_boolean_function(proposition) if proposition['condition'] == 'default' then return assert(loadstring("return " .. "\"" .. proposition["upstream_url"] .. "\"")) end - return assert(loadstring("if " .. proposition["condition"] .. "then return " .. "\"" .. proposition["upstream_url"] .. "\"" .. " end")) + local upstream_url = build_url(proposition["upstream_url"], kong_proxy_port) + return assert(loadstring("if " .. proposition["condition"] .. "then return " .. "\"" .. upstream_url .. "\"" .. " end")) end function get_upstream_url(conf) @@ -75,7 +89,7 @@ function set_upstream(upstream_url) end function AdvancedRouterHandler:access(conf) - local io_data, err = get_io_data(conf) + local io_data, err = get_io_data(pl_tablex.merge(conf, { kong_proxy_port = kong_proxy_port }, true)) if err then kong.log.err("Error in getting io data" .. inspect(err)) return kong.response.exit(500, { error = "Error in getting io data" .. inspect(err) }) @@ -90,6 +104,10 @@ function AdvancedRouterHandler:access(conf) set_upstream(upstream_url) end +function AdvancedRouterHandler:init_worker() + kong_proxy_port = get_poxy_port() +end + return AdvancedRouterHandler diff --git a/kong/plugins/advanced-router/io.lua b/kong/plugins/advanced-router/io.lua index 3d5a05e..1060c7b 100644 --- a/kong/plugins/advanced-router/io.lua +++ b/kong/plugins/advanced-router/io.lua @@ -6,6 +6,7 @@ local generate_signature_hash = require("kong.plugins.advanced-router.utils").ge local extract = require "kong.plugins.advanced-router.utils".extract local belongs = require "kong.plugins.advanced-router.utils".belongs local replaceStringEnvVariables = require "kong.plugins.advanced-router.utils".replaceStringEnvVariables +local build_url = require("kong.plugins.advanced-router.utils").build_url local _M = {} @@ -122,7 +123,7 @@ end function create_io_request(conf) local io_request = extract_io_data_from_request(conf) kong.log.debug("conf" .. inspect(conf)) - io_request["io_url"] = replaceStringEnvVariables(conf.io_url) + io_request["io_url"] = build_url(replaceStringEnvVariables(conf.io_url), conf.kong_proxy_port) io_request["io_http_method"] = conf.io_http_method return io_request end diff --git a/kong/plugins/advanced-router/utils.lua b/kong/plugins/advanced-router/utils.lua index 1ac96a5..930cd48 100644 --- a/kong/plugins/advanced-router/utils.lua +++ b/kong/plugins/advanced-router/utils.lua @@ -2,6 +2,7 @@ local pl_utils = require "pl.utils" local sha256 = require "resty.sha256" local encode_base64 = ngx.encode_base64 local inspect = require "inspect" +local url = require "socket.url" local _M = {} @@ -55,4 +56,13 @@ function _M.belongs(val, tbl) return false end +function _M.build_url(upstream_url, kong_proxy_port) + local parsed_url = url.parse(upstream_url); + if not parsed_url["host"] then + parsed_url["host"] = "localhost" + parsed_url["port"] = kong_proxy_port + end + return url.build(parsed_url) +end + return _M