From 08b767fadd181251c1a3bd0b5c8667b4c9c908a5 Mon Sep 17 00:00:00 2001 From: Zeping Bai Date: Sun, 22 Jan 2023 13:00:07 +0800 Subject: [PATCH 1/2] fix: let proxy-mirror obey uri rewrite --- apisix/plugins/proxy-mirror.lua | 18 ++++++---- t/plugin/proxy-mirror.t | 63 +++++++++++++++++++++++++++++++++ 2 files changed, 75 insertions(+), 6 deletions(-) diff --git a/apisix/plugins/proxy-mirror.lua b/apisix/plugins/proxy-mirror.lua index 460f0e4f6a57..312d3ec37b68 100644 --- a/apisix/plugins/proxy-mirror.lua +++ b/apisix/plugins/proxy-mirror.lua @@ -89,14 +89,20 @@ end local function enable_mirror(ctx, conf) - if conf.path and conf.path_concat_mode == "prefix" then - ctx.var.upstream_mirror_uri = resolver_host(conf.host) .. conf.path .. ctx.var.uri .. - ctx.var.is_args .. (ctx.var.args or '') - else - ctx.var.upstream_mirror_uri = resolver_host(conf.host) .. (conf.path or ctx.var.uri) .. - ctx.var.is_args .. (ctx.var.args or '') + local uri = (ctx.var.upstream_uri and ctx.var.upstream_uri ~= "") and + ctx.var.upstream_uri or + ctx.var.uri .. ctx.var.is_args .. (ctx.var.args or '') + + if conf.path then + if conf.path_concat_mode == "prefix" then + uri = conf.path .. uri + else + uri = conf.path .. ctx.var.is_args .. (ctx.var.args or '') + end end + ctx.var.upstream_mirror_uri = resolver_host(conf.host) .. uri + if has_mod then apisix_ngx_client.enable_mirror() end diff --git a/t/plugin/proxy-mirror.t b/t/plugin/proxy-mirror.t index 9c58f4bac98e..7c5fd21b3fd0 100644 --- a/t/plugin/proxy-mirror.t +++ b/t/plugin/proxy-mirror.t @@ -838,3 +838,66 @@ GET /hello?a=1 hello world --- error_log uri: /a/hello?a=1 + + + +=== TEST 30: use proxy-rewrite to change uri before mirror +--- config + location /t { + content_by_lua_block { + local t = require("lib.test_admin").test + local code, body = t('/apisix/admin/routes/1', + ngx.HTTP_PUT, + [[{ + "plugins": { + "proxy-rewrite":{ + "_meta": { + "priority": 1010 + }, + "uri": "/hello" + }, + "proxy-mirror": { + "_meta": { + "priority": 1008 + }, + "host": "http://127.0.0.1:1986" + } + }, + "upstream": { + "nodes": { + "127.0.0.1:1980": 1 + }, + "type": "roundrobin" + }, + "uri": "/nope" + }]] + ) + + if code >= 300 then + ngx.status = code + end + ngx.say(body) + } + } +--- response_body +passed + + + +=== TEST 31: hit route (with proxy-rewrite) +--- request +GET /nope +--- response_body +hello world +--- error_log +uri: /hello + + + +=== TEST 32: hit route (with proxy-rewrite and args) +--- request +GET /nope?a=b&b=c&c=d +--- response_body +hello world +--- error_log +uri: /hello?a=b&b=c&c=d From e079dd4fcbc90183341e7701c2f50cd8e0d1c71a Mon Sep 17 00:00:00 2001 From: Zeping Bai Date: Sat, 28 Jan 2023 14:48:11 +0800 Subject: [PATCH 2/2] test: move cases to new file --- t/plugin/proxy-mirror.t | 63 ------------------- t/plugin/proxy-mirror2.t | 128 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 128 insertions(+), 63 deletions(-) create mode 100644 t/plugin/proxy-mirror2.t diff --git a/t/plugin/proxy-mirror.t b/t/plugin/proxy-mirror.t index 7c5fd21b3fd0..9c58f4bac98e 100644 --- a/t/plugin/proxy-mirror.t +++ b/t/plugin/proxy-mirror.t @@ -838,66 +838,3 @@ GET /hello?a=1 hello world --- error_log uri: /a/hello?a=1 - - - -=== TEST 30: use proxy-rewrite to change uri before mirror ---- config - location /t { - content_by_lua_block { - local t = require("lib.test_admin").test - local code, body = t('/apisix/admin/routes/1', - ngx.HTTP_PUT, - [[{ - "plugins": { - "proxy-rewrite":{ - "_meta": { - "priority": 1010 - }, - "uri": "/hello" - }, - "proxy-mirror": { - "_meta": { - "priority": 1008 - }, - "host": "http://127.0.0.1:1986" - } - }, - "upstream": { - "nodes": { - "127.0.0.1:1980": 1 - }, - "type": "roundrobin" - }, - "uri": "/nope" - }]] - ) - - if code >= 300 then - ngx.status = code - end - ngx.say(body) - } - } ---- response_body -passed - - - -=== TEST 31: hit route (with proxy-rewrite) ---- request -GET /nope ---- response_body -hello world ---- error_log -uri: /hello - - - -=== TEST 32: hit route (with proxy-rewrite and args) ---- request -GET /nope?a=b&b=c&c=d ---- response_body -hello world ---- error_log -uri: /hello?a=b&b=c&c=d diff --git a/t/plugin/proxy-mirror2.t b/t/plugin/proxy-mirror2.t new file mode 100644 index 000000000000..adc2b4c6de89 --- /dev/null +++ b/t/plugin/proxy-mirror2.t @@ -0,0 +1,128 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +use t::APISIX 'no_plan'; + +repeat_each(1); +no_long_string(); +no_shuffle(); +no_root_location(); +log_level('info'); +worker_connections(1024); + +add_block_preprocessor(sub { + my ($block) = @_; + + my $http_config = $block->http_config // <<_EOC_; + + server { + listen 1986; + server_tokens off; + + location / { + content_by_lua_block { + local core = require("apisix.core") + core.log.info("upstream_http_version: ", ngx.req.http_version()) + + local headers_tab = ngx.req.get_headers() + local headers_key = {} + for k in pairs(headers_tab) do + core.table.insert(headers_key, k) + end + core.table.sort(headers_key) + + for _, v in pairs(headers_key) do + core.log.info(v, ": ", headers_tab[v]) + end + + core.log.info("uri: ", ngx.var.request_uri) + ngx.say("hello world") + } + } + } +_EOC_ + + $block->set_value("http_config", $http_config); + + if (!$block->request) { + $block->set_value("request", "GET /t"); + } +}); + +run_tests; + +__DATA__ + +=== TEST 1: use proxy-rewrite to change uri before mirror +--- config + location /t { + content_by_lua_block { + local t = require("lib.test_admin").test + local code, body = t('/apisix/admin/routes/1', + ngx.HTTP_PUT, + [[{ + "plugins": { + "proxy-rewrite":{ + "_meta": { + "priority": 1010 + }, + "uri": "/hello" + }, + "proxy-mirror": { + "_meta": { + "priority": 1008 + }, + "host": "http://127.0.0.1:1986" + } + }, + "upstream": { + "nodes": { + "127.0.0.1:1980": 1 + }, + "type": "roundrobin" + }, + "uri": "/nope" + }]] + ) + + if code >= 300 then + ngx.status = code + end + ngx.say(body) + } + } +--- response_body +passed + + + +=== TEST 2: hit route (with proxy-rewrite) +--- request +GET /nope +--- response_body +hello world +--- error_log +uri: /hello + + + +=== TEST 3: hit route (with proxy-rewrite and args) +--- request +GET /nope?a=b&b=c&c=d +--- response_body +hello world +--- error_log +uri: /hello?a=b&b=c&c=d