This is an automated email from the ASF dual-hosted git repository. wenming 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 5aa842fe3 fix: original key being modified causing cache inconsistency (#12299) 5aa842fe3 is described below commit 5aa842fe3bfc6d0752a366123acbe76148ec07d6 Author: Ashish Tiwari <ashishjaitiwari15112...@gmail.com> AuthorDate: Tue Jun 10 09:44:21 2025 +0530 fix: original key being modified causing cache inconsistency (#12299) --- apisix/core/ctx.lua | 11 +++--- t/core/ctx3.t | 100 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 106 insertions(+), 5 deletions(-) diff --git a/apisix/core/ctx.lua b/apisix/core/ctx.lua index 36b8788bd..561c1931a 100644 --- a/apisix/core/ctx.lua +++ b/apisix/core/ctx.lua @@ -224,6 +224,7 @@ do __index = function(t, key) local cached = t._cache[key] if cached ~= nil then + log.info("serving ctx value from cache for key: ", key) return cached end @@ -283,14 +284,14 @@ do end elseif core_str.has_prefix(key, "http_") then - key = key:lower() - key = re_gsub(key, "-", "_", "jo") - val = get_var(key, t._request) + local arg_key = key:lower() + arg_key = re_gsub(arg_key, "-", "_", "jo") + val = get_var(arg_key, t._request) elseif core_str.has_prefix(key, "graphql_") then -- trim the "graphql_" prefix - key = sub_str(key, 9) - val = get_parsed_graphql()[key] + local arg_key = sub_str(key, 9) + val = get_parsed_graphql()[arg_key] else local getter = apisix_var_names[key] diff --git a/t/core/ctx3.t b/t/core/ctx3.t new file mode 100644 index 000000000..3686d2649 --- /dev/null +++ b/t/core/ctx3.t @@ -0,0 +1,100 @@ +# +# 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_root_location(); + +add_block_preprocessor(sub { + my ($block) = @_; + + if (!$block->request) { + $block->set_value("request", "GET /t"); + } + + if (!$block->response_body) { + $block->set_value("response_body", "passed\n"); + } + + if (!$block->no_error_log && !$block->error_log) { + $block->set_value("no_error_log", "[error]\n[alert]"); + } +}); + +run_tests; + +__DATA__ + +=== TEST 1: parse graphql only once and use subsequent from cache +--- 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, + [=[{ + "methods": ["POST"], + "upstream": { + "nodes": { + "127.0.0.1:1980": 1 + }, + "type": "roundrobin" + }, + "plugins": { + "serverless-pre-function": { + "phase": "header_filter", + "functions" : ["return function(conf, ctx) + ngx.log(ngx.WARN, 'find ctx._graphql: ', ctx.var.graphql_name == \"repo\"); + ngx.log(ngx.WARN, 'find ctx._graphql: ', ctx.var.graphql_name == \"repo\"); + ngx.log(ngx.WARN, 'find ctx._graphql: ', ctx.var.graphql_name == \"repo\"); + end"] + } + }, + "uri": "/hello", + "vars": [["graphql_name", "==", "repo"]] + }]=] + ) + + if code >= 300 then + ngx.status = code + end + ngx.say(body) + } + } +--- response_body +passed + + + +=== TEST 2: hit +--- request +POST /hello +query repo { + owner { + name + } +} +--- response_body +hello world +--- error_log +--- grep_error_log eval +qr/serving ctx value from cache for key: graphql_name/ +--- grep_error_log_out +serving ctx value from cache for key: graphql_name +serving ctx value from cache for key: graphql_name +serving ctx value from cache for key: graphql_name