You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@apisix.apache.org by "kingluo (via GitHub)" <gi...@apache.org> on 2023/04/04 02:58:45 UTC
[GitHub] [apisix] kingluo commented on issue #9228: bug: hold_body_chunk can not be used in more than one plugin
kingluo commented on issue #9228:
URL: https://github.com/apache/apisix/issues/9228#issuecomment-1495272975
@leslie-tsang
IMO, the best solution is to export the plugin_name in the `ctx` when running the plugin, so that `hold_body_chunk()` could collect the body in the buffer bound to the plugin to avoid pollution.
**Tested patch:**
```diff
diff --git a/apisix/core/response.lua b/apisix/core/response.lua
index b934d94b..c7eebdc3 100644
--- a/apisix/core/response.lua
+++ b/apisix/core/response.lua
@@ -178,13 +178,15 @@ function _M.hold_body_chunk(ctx, hold_the_copy)
local body_buffer
local chunk, eof = arg[1], arg[2]
if type(chunk) == "string" and chunk ~= "" then
- body_buffer = ctx._body_buffer
+ if not ctx._body_buffer then
+ ctx._body_buffer = {}
+ end
if not body_buffer then
body_buffer = {
chunk,
n = 1
}
- ctx._body_buffer = body_buffer
+ ctx._body_buffer[ctx._plugin_name] = body_buffer
else
local n = body_buffer.n + 1
body_buffer.n = n
@@ -193,13 +195,13 @@ function _M.hold_body_chunk(ctx, hold_the_copy)
end
if eof then
- body_buffer = ctx._body_buffer
+ body_buffer = ctx._body_buffer[ctx._plugin_name]
if not body_buffer then
return chunk
end
body_buffer = concat_tab(body_buffer, "", 1, body_buffer.n)
- ctx._body_buffer = nil
+ ctx._body_buffer[ctx._plugin_name] = nil
return body_buffer
end
diff --git a/apisix/plugin.lua b/apisix/plugin.lua
index 3b5cecac..a7d55db7 100644
--- a/apisix/plugin.lua
+++ b/apisix/plugin.lua
@@ -1091,7 +1091,9 @@ function _M.run_plugin(phase, plugins, api_ctx)
end
plugin_run = true
+ api_ctx._plugin_name = plugins[i]["name"]
local code, body = phase_func(conf, api_ctx)
+ api_ctx._plugin_name = nil
if code or body then
if is_http then
if code >= 400 then
@@ -1126,7 +1128,9 @@ function _M.run_plugin(phase, plugins, api_ctx)
local conf = plugins[i + 1]
if phase_func and meta_filter(api_ctx, plugins[i]["name"], conf) then
plugin_run = true
+ api_ctx._plugin_name = plugins[i]["name"]
phase_func(conf, api_ctx)
+ api_ctx._plugin_name = nil
end
end
```
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: notifications-unsubscribe@apisix.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org