bug(body-transformer): runtime crash when request or response body is a JSON primitive
Los mantenedores suelen responder en 2 días
@bhuvan-somisetty ya está trabajando en esto.
Desde el 5/11/2026.
- #14165 de @bhuvan-somisetty — abierto
Evaluación
- Dificultad
- 2/5
- Tiempo estimado
- 1-3 horas
- Aptitud para principiantes
- 78/100
- Tipo de issue
- Error
- Claridad
- Bien especificado
- Estado de actividad
- Activo
- Área
- backend
Línea de trabajo
Empieza en apisix/plugins/body-transformer.lua, en el decodificador JSON y en el código que adjunta metadatos a out. Revisa las pruebas existentes de body-transformer para la decodificación de solicitudes y respuestas JSON y añade cobertura para valores primitivos como 123 y true. Se considera terminado cuando un cuerpo primitivo devuelve HTTP 400 con el error de decodificación especificado, en lugar de causar un error en tiempo de ejecución.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Current Behavior
In apisix/plugins/body-transformer.lua, when input_format is "json" (or inferred from Content-Type: application/json), the decoder decodes the request or response body via core.json.decode:
local decoders = {
...
json = function(data)
return core.json.decode(data)
end,
...
}
When a client sends a valid JSON primitive (such as a number 123, a string "hello", a boolean true/false, or null), core.json.decode(data) returns a Lua primitive value (number, string, boolean, or cjson.null userdata) instead of a table.
Because out is truthy, execution continues to:
out._ctx = nil
out._body = nil
out._escape_xml = nil
out._escape_json = nil
out._multipart = nil
setmetatable(out, {__index = {
_ctx = ctx,
_body = body,
_escape_xml = escape_xml,
_escape_json = escape_json,
_multipart = _multipart
}})
Attempting to index fields on a primitive (out._ctx = nil) causes a fatal Lua runtime error:
attempt to index local 'out' (a number value)
Similarly, setmetatable fails when passed a non-table value (bad argument #1 to 'setmetatable' (table expected, got number)).
As a result, the Lua thread aborts with HTTP 500 Internal Server Error instead of rejecting the invalid body structure with HTTP 400 Bad Request.
Expected Behavior
The body-transformer plugin requires a JSON object ({}) or array ([]) to populate the template context and attach helper metadata via setmetatable. When input_format is "json" and the body decodes to a non-table value, the decoder should reject it gracefully and return HTTP 400 Bad Request with request body decode: expected JSON object or array rather than crashing with HTTP 500.
Error Logs
2026/11/05 12:00:00 [error] 12345#12345: *1 lua entry thread aborted: runtime error: /usr/local/apisix/apisix/plugins/body-transformer.lua:200: attempt to index local 'out' (a number value)
stack traceback:
coroutine 0:
/usr/local/apisix/apisix/plugins/body-transformer.lua: in function 'transform'
/usr/local/apisix/apisix/plugins/body-transformer.lua: in function 'rewrite'
/usr/local/apisix/apisix/init.lua: in function 'http_rewrite_phase'
Steps to Reproduce
- Create a route with
body-transformer:
curl -X PUT http://127.0.0.1:9180/apisix/admin/routes/1 \
-H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' \
-d '{
"uri": "/echo",
"plugins": {
"body-transformer": {
"request": {
"input_format": "json",
"template": "hello"
}
}
},
"upstream": {
"type": "roundrobin",
"nodes": {
"127.0.0.1:1980": 1
}
}
}'
- Send a request with a JSON number or string:
curl -X POST http://127.0.0.1:9080/echo \
-H "Content-Type: application/json" \
-d '123'
- The request fails with HTTP 500 and the error log shows
attempt to index local 'out' (a number value).
Environment
- APISIX version (run
apisix version): master (3.19.0) - Operating system (run
uname -a): Linux 5.15.0-generic x86_64 - OpenResty / Nginx version (run
openresty -Vornginx -V): openresty/1.25.3.1 - etcd version, if relevant (run
curl http://127.0.0.1:9090/v1/server_info): 3.5.11
- Lenguaje dominante
- Lua
- Estrellas
- 17.3k
- Forks
- 3k
- Merge medio
- 4 d 14 h
- PR fusionados (30 d)
- 73
Preparar el entorno
Inicia el contenedor de desarrollo del proyecto en tu navegador, con tu propia cuenta de GitHub.
- Sin Dockerfile ni archivo de Docker Compose
- Tiene una plantilla de pull request
- Leer la guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de apache/apisix
-
bug: an admin key injected with ${{VAR}} that contains only digits becomes a number, so the correct key gets 401Posiblemente ocupada @Ymmcc la tomó hace 1 día. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
Los mantenedores suelen responder en 2 días
-
bug: openapi-to-mcp appends a second ? to a query-suffixed path templatePosiblemente ocupada @lordcheng10 la tomó hace 6 días. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 83/100
Los mantenedores suelen responder en 2 días
-
ai-proxy forwards client `Transfer-Encoding: chunked` but sends an unchunked body (upstream 400)Posiblemente ocupada @locker95 la tomó hace 4 días. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 82/100
Los mantenedores suelen responder en 2 días
-
As a user, I want the opa plugin to propagate trace context (traceparent) to OPA, so that OPA spans are linked to the APISIX request tracePosiblemente ocupada @GitNimay la tomó hace 21 días. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
apache/apisix#14051 · 3 comentarios ·
Los mantenedores suelen responder en 2 días
-
bug: splunk-hec-logging crashes with nil concatenation when error response json lacks text fieldPosiblemente ocupada @LiteSun la tomó hace 13 días. Abiertobug
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
apache/apisix#14011 · 1 comentario · 1 asignado ·
Los mantenedores suelen responder en 2 días
Todos los issues de apache/apisix
Issues similares
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
obsidian-nvim/obsidian.nvim#1027 ·
Los mantenedores suelen responder en 1 día
-
Top Panel Quote EnhancementAbiertoarea: top panel enhancement
Dificultad 2/5 1-3 horas Aptitud para principiantes 65/100
AndyHazz/bookshelf.koplugin#599 · 2 comentarios ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 74/100
-
severity: low
Dificultad 2/5 1-3 horas Aptitud para principiantes 82/100
luainkernel/lunatik#2460 ·
Los mantenedores suelen responder en 1 día
-
bug
Dificultad 2/5 1-3 horas Aptitud para principiantes 70/100
Los mantenedores suelen responder en 1 día