diff --git a/README.markdown b/README.markdown
index af9555f80b..e14d302bfb 100644
--- a/README.markdown
+++ b/README.markdown
@@ -5563,6 +5563,8 @@ If the request body has been read into memory, try calling the [ngx.req.get_body
To force in-file request bodies, try turning on [client_body_in_file_only](http://nginx.org/en/docs/http/ngx_http_core_module.html#client_body_in_file_only).
+Note that this function is also work for balancer phase but it needs to call [balancer.recreate_request](https://github.com/openresty/lua-resty-core/blob/master/lib/ngx/balancer.md#recreate_request) to make the change take effect after set the request body data or headers.
+
This function was first introduced in the `v0.3.1rc17` release.
See also [ngx.req.get_body_data](#ngxreqget_body_data).
@@ -5574,7 +5576,7 @@ ngx.req.set_body_data
**syntax:** *ngx.req.set_body_data(data)*
-**context:** *rewrite_by_lua*, access_by_lua*, content_by_lua**
+**context:** *rewrite_by_lua*, access_by_lua*, content_by_lua*, balancer_by_lua*,*
Set the current request's request body using the in-memory data specified by the `data` argument.
@@ -5582,6 +5584,8 @@ If the request body has not been read yet, call [ngx.req.read_body](#ngxreqread_
Whether the previous request body has been read into memory or buffered into a disk file, it will be freed or the disk file will be cleaned up immediately, respectively.
+Note that this function is also work for balancer phase but it needs to call [balancer.recreate_request](https://github.com/openresty/lua-resty-core/blob/master/lib/ngx/balancer.md#recreate_request) to make the change take effect after set the request body data or headers.
+
This function was first introduced in the `v0.3.1rc18` release.
See also [ngx.req.set_body_file](#ngxreqset_body_file).
@@ -5593,7 +5597,7 @@ ngx.req.set_body_file
**syntax:** *ngx.req.set_body_file(file_name, auto_clean?)*
-**context:** *rewrite_by_lua*, access_by_lua*, content_by_lua**
+**context:** *rewrite_by_lua*, access_by_lua*, content_by_lua*, balancer_by_lua*,*
Set the current request's request body using the in-file data specified by the `file_name` argument.
diff --git a/doc/HttpLuaModule.wiki b/doc/HttpLuaModule.wiki
index 89cf1ca707..a0e6d28fac 100644
--- a/doc/HttpLuaModule.wiki
+++ b/doc/HttpLuaModule.wiki
@@ -4657,7 +4657,7 @@ See also [[#ngx.req.get_body_data|ngx.req.get_body_data]].
'''syntax:''' ''ngx.req.set_body_data(data)''
-'''context:''' ''rewrite_by_lua*, access_by_lua*, content_by_lua*''
+'''context:''' ''rewrite_by_lua*, access_by_lua*, content_by_lua*, balancer_by_lua*''
Set the current request's request body using the in-memory data specified by the data
argument.
@@ -4665,6 +4665,8 @@ If the request body has not been read yet, call [[#ngx.req.read_body|ngx.req.rea
Whether the previous request body has been read into memory or buffered into a disk file, it will be freed or the disk file will be cleaned up immediately, respectively.
+Note that this function is also work for balancer phase but it needs to call [https://github.com/openresty/lua-resty-core/blob/master/lib/ngx/balancer.md#recreate_request balancer.recreate_request] to make the change take effect after set the request body data or headers.
+
This function was first introduced in the v0.3.1rc18
release.
See also [[#ngx.req.set_body_file|ngx.req.set_body_file]].
@@ -4673,7 +4675,7 @@ See also [[#ngx.req.set_body_file|ngx.req.set_body_file]].
'''syntax:''' ''ngx.req.set_body_file(file_name, auto_clean?)''
-'''context:''' ''rewrite_by_lua*, access_by_lua*, content_by_lua*''
+'''context:''' ''rewrite_by_lua*, access_by_lua*, content_by_lua*, balancer_by_lua*''
Set the current request's request body using the in-file data specified by the file_name
argument.
@@ -4685,6 +4687,8 @@ Please ensure that the file specified by the file_name
argument exi
Whether the previous request body has been read into memory or buffered into a disk file, it will be freed or the disk file will be cleaned up immediately, respectively.
+Note that this function is also work for balancer phase but it needs to call [https://github.com/openresty/lua-resty-core/blob/master/lib/ngx/balancer.md#recreate_request balancer.recreate_request] to make the change take effect after set the request body data or headers.
+
This function was first introduced in the v0.3.1rc18
release.
See also [[#ngx.req.set_body_data|ngx.req.set_body_data]].
diff --git a/src/ngx_http_lua_balancer.c b/src/ngx_http_lua_balancer.c
index 620f71eea0..5401a1ac88 100644
--- a/src/ngx_http_lua_balancer.c
+++ b/src/ngx_http_lua_balancer.c
@@ -1288,7 +1288,7 @@ ngx_http_lua_ffi_balancer_recreate_request(ngx_http_request_t *r,
/* u->request_bufs already contains a valid request buffer
* remove it from chain first
*/
- u->request_bufs = u->request_bufs->next;
+ u->request_bufs = r->request_body->bufs;
}
return u->create_request(r);
diff --git a/t/138-balancer.t b/t/138-balancer.t
index 5ea94df96d..df63a03cda 100644
--- a/t/138-balancer.t
+++ b/t/138-balancer.t
@@ -12,7 +12,7 @@ use Test::Nginx::Socket::Lua;
repeat_each(2);
-plan tests => repeat_each() * (blocks() * 4 + 9);
+plan tests => repeat_each() * (blocks() * 4 + 7);
#no_diff();
no_long_string();
@@ -637,3 +637,43 @@ ok
--- no_error_log
[error]
[cirt]
+
+
+=== TEST 20: recreate_request refresh body buffer when ngx.req.set_body_data is used in balancer phase
+--- http_config
+ lua_package_path "../lua-resty-core/lib/?.lua;;";
+
+ server {
+ listen 127.0.0.1:$TEST_NGINX_RAND_PORT_1;
+
+ location / {
+ content_by_lua_block {
+ ngx.req.read_body()
+ local body = ngx.req.get_body_data()
+ ngx.log(ngx.ERR, "body: ", body)
+ ngx.say(body)
+ }
+ }
+ }
+
+ upstream foo {
+ server 127.0.0.1:$TEST_NGINX_RAND_PORT_1 max_fails=0;
+
+ balancer_by_lua_block {
+ local bal = require "ngx.balancer"
+ ngx.req.set_body_data("hello world")
+ assert(bal.recreate_request())
+ }
+ }
+
+--- config
+ location = /t {
+ proxy_http_version 1.1;
+ proxy_set_header Connection "";
+ proxy_pass http://foo;
+ }
+--- request
+GET /t
+--- error_code: 200
+--- response_body
+hello world