From c31edf3899eeeba97bc2ac26fc7b9c49c9833a97 Mon Sep 17 00:00:00 2001 From: YuanSheng Wang Date: Thu, 16 Apr 2020 08:00:45 +0800 Subject: [PATCH] bug: uri safe encode. (#1461) --- apisix/core/utils.lua | 21 +++++++++++++++++++++ apisix/plugins/proxy-rewrite.lua | 2 ++ 2 files changed, 23 insertions(+) diff --git a/apisix/core/utils.lua b/apisix/core/utils.lua index 98e678e0e465..d85f7bb42db1 100644 --- a/apisix/core/utils.lua +++ b/apisix/core/utils.lua @@ -18,11 +18,22 @@ local table = require("apisix.core.table") local ngx_re = require("ngx.re") local resolver = require("resty.dns.resolver") local ipmatcher= require("resty.ipmatcher") +local ffi = require("ffi") +local base = require("resty.core.base") local open = io.open local math = math local sub_str = string.sub local str_byte = string.byte local tonumber = tonumber +local C = ffi.C +local ffi_string = ffi.string +local get_string_buf = base.get_string_buf + + +ffi.cdef[[ + int ngx_escape_uri(char *dst, const char *src, + size_t size, int type); +]] local _M = { @@ -144,4 +155,14 @@ function _M.parse_addr(addr) end +function _M.uri_safe_encode(uri) + local count_escaped = C.ngx_escape_uri(nil, uri, #uri, 0) + local len = #uri + 2 * count_escaped + local buf = get_string_buf(len) + C.ngx_escape_uri(buf, uri, #uri, 0) + + return ffi_string(buf, len) +end + + return _M diff --git a/apisix/plugins/proxy-rewrite.lua b/apisix/plugins/proxy-rewrite.lua index 70d4cf3bf01f..b65384d88b7c 100644 --- a/apisix/plugins/proxy-rewrite.lua +++ b/apisix/plugins/proxy-rewrite.lua @@ -144,6 +144,8 @@ function _M.rewrite(conf, ctx) end end + upstream_uri = core.utils.uri_safe_encode(upstream_uri) + if ctx.var.is_args == "?" then ctx.var.upstream_uri = upstream_uri .. "?" .. (ctx.var.args or "") else