diff --git a/apisix/plugins/batch-requests.lua b/apisix/plugins/batch-requests.lua index a1b574307ef6..fed04cb3b4ff 100644 --- a/apisix/plugins/batch-requests.lua +++ b/apisix/plugins/batch-requests.lua @@ -268,6 +268,7 @@ local function batch_requests(ctx) status = 504, reason = "upstream timeout" }) + goto CONTINUE end local sub_resp = { status = resp.status, @@ -285,6 +286,7 @@ local function batch_requests(ctx) end end core.table.insert(aggregated_resp, sub_resp) + ::CONTINUE:: end return 200, aggregated_resp end diff --git a/t/plugin/batch-requests2.t b/t/plugin/batch-requests2.t index b7ac1c6d9fb3..ad3602e9397c 100644 --- a/t/plugin/batch-requests2.t +++ b/t/plugin/batch-requests2.t @@ -444,3 +444,52 @@ POST /apisix/batch-requests } --- response_headers Content-Type: application/json + + + +=== TEST 11: Ensure sub_responses count matches sub_requests on timed out sub_request (contains no empty json object like '{}' in batch response) +--- config + location = /aggregate { + content_by_lua_block { + local cjson = require("cjson.safe") + local core = require("apisix.core") + local t = require("lib.test_admin").test + local code, body, res_body, res_header = t('/apisix/batch-requests', + ngx.HTTP_POST, + [=[{ + "headers": { + }, + "timeout": 200, + "pipeline":[ + { + "path": "/ok", + "method": "GET" + },{ + "path": "/timeout", + "method": "GET" + }] + }]=]) + ngx.status = code + -- print the number of sub-responses. + -- the number is expected to be the same as that of the sub-requests. + ngx.say(#cjson.decode(res_body)) + } + } + + location = /ok { + content_by_lua_block { + ngx.print("ok") + } + } + location = /timeout { + content_by_lua_block { + ngx.sleep(1) + ngx.print("timeout") + } + } +--- request +GET /aggregate +--- error_log +timeout +--- response_body +2