This is an automated email from the ASF dual-hosted git repository.

shreemaan-abhishek 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 f0270cd22a fix: reframe request body forwarded upstream in serverless 
plugins (#13798)
f0270cd22a is described below

commit f0270cd22ac25080b0a006cfd8bbc6ea1c5f420b
Author: Shreemaan Abhishek <[email protected]>
AuthorDate: Mon Aug 17 17:43:37 2026 +0800

    fix: reframe request body forwarded upstream in serverless plugins (#13798)
---
 apisix/plugins/serverless/generic-upstream.lua |  5 ++
 t/plugin/aws-lambda.t                          | 72 ++++++++++++++++++++++++++
 2 files changed, 77 insertions(+)

diff --git a/apisix/plugins/serverless/generic-upstream.lua 
b/apisix/plugins/serverless/generic-upstream.lua
index 5c3a6c5879..4caa35c780 100644
--- a/apisix/plugins/serverless/generic-upstream.lua
+++ b/apisix/plugins/serverless/generic-upstream.lua
@@ -69,6 +69,11 @@ return function(plugin_name, version, priority, 
request_processor, authz_schema,
         local uri_args = core.request.get_uri_args(ctx)
         local headers = core.request.headers(ctx) or {}
 
+        -- body is already de-chunked by nginx; drop the client's framing 
headers
+        -- so the http client reframes it with a correct Content-Length
+        headers["transfer-encoding"] = nil
+        headers["content-length"] = nil
+
         local req_body, err = core.request.get_body(conf.max_req_body_size)
 
         if err then
diff --git a/t/plugin/aws-lambda.t b/t/plugin/aws-lambda.t
index 4a3ea8a6d5..e79e43715c 100644
--- a/t/plugin/aws-lambda.t
+++ b/t/plugin/aws-lambda.t
@@ -510,3 +510,75 @@ end
 passed
 query: a=%2A&a-=x&flag=&multi=m1&multi=m2&with%20space=a%2Fb%20c
 signature: ok
+
+
+
+=== TEST 10: create route for chunked-body framing check
+--- 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": {
+                            "aws-lambda": {
+                                "function_uri": "http://localhost:8765/generic";
+                            }
+                        },
+                        "uri": "/aws"
+                }]]
+                )
+            if code >= 300 then
+                ngx.status = code
+                ngx.say("fail")
+                return
+            end
+            ngx.say(body)
+        }
+    }
+--- response_body
+passed
+
+
+
+=== TEST 11: chunked client body is reframed with a correct Content-Length
+--- inside_lua_block
+        ngx.req.read_body()
+        local te = ngx.req.get_headers()["transfer-encoding"]
+        ngx.say("te=", tostring(te))
+        ngx.say("body=", ngx.req.get_body_data() or "")
+--- config
+    location /t {
+        content_by_lua_block {
+            local sock = ngx.socket.tcp()
+            sock:settimeout(2000)
+            local ok, err = sock:connect("127.0.0.1", 1984)
+            if not ok then
+                ngx.say("connect failed: ", err)
+                return
+            end
+            local payload = "hello world"
+            local req = "POST /aws HTTP/1.1\r\n"
+                .. "Host: 127.0.0.1\r\n"
+                .. "Transfer-Encoding: chunked\r\n"
+                .. "Content-Type: text/plain\r\n"
+                .. "Connection: close\r\n\r\n"
+                .. string.format("%x\r\n%s\r\n0\r\n\r\n", #payload, payload)
+            local bytes, err = sock:send(req)
+            if not bytes then
+                ngx.say("send failed: ", err)
+                return
+            end
+            local data, err, partial = sock:receive("*a")
+            data = data or partial or ""
+            sock:close()
+            if data:find("te=nil", 1, true) and data:find("body=hello world", 
1, true) then
+                ngx.say("PASS")
+            else
+                ngx.say("FAIL: ", data)
+            end
+        }
+    }
+--- response_body
+PASS

Reply via email to