enable the ngx.shared API in set_by_lua* and header_filter_by_lua* too ;)
This commit is contained in:
Родитель
9c26604bf4
Коммит
a935e6fdbf
|
@ -19,6 +19,7 @@
|
||||||
#include "ngx_http_lua_string.h"
|
#include "ngx_http_lua_string.h"
|
||||||
#include "ngx_http_lua_misc.h"
|
#include "ngx_http_lua_misc.h"
|
||||||
#include "ngx_http_lua_consts.h"
|
#include "ngx_http_lua_consts.h"
|
||||||
|
#include "ngx_http_lua_shdict.h"
|
||||||
|
|
||||||
|
|
||||||
static ngx_http_output_header_filter_pt ngx_http_next_header_filter;
|
static ngx_http_output_header_filter_pt ngx_http_next_header_filter;
|
||||||
|
@ -38,6 +39,10 @@ static ngx_http_output_header_filter_pt ngx_http_next_header_filter;
|
||||||
static void
|
static void
|
||||||
ngx_http_lua_header_filter_by_lua_env(lua_State *L, ngx_http_request_t *r)
|
ngx_http_lua_header_filter_by_lua_env(lua_State *L, ngx_http_request_t *r)
|
||||||
{
|
{
|
||||||
|
ngx_http_lua_main_conf_t *lmcf;
|
||||||
|
|
||||||
|
lmcf = ngx_http_get_module_main_conf(r, ngx_http_lua_module);
|
||||||
|
|
||||||
/* set nginx request pointer to current lua thread's globals table */
|
/* set nginx request pointer to current lua thread's globals table */
|
||||||
lua_pushlightuserdata(L, r);
|
lua_pushlightuserdata(L, r);
|
||||||
lua_setglobal(L, GLOBALS_SYMBOL_REQUEST);
|
lua_setglobal(L, GLOBALS_SYMBOL_REQUEST);
|
||||||
|
@ -74,6 +79,7 @@ ngx_http_lua_header_filter_by_lua_env(lua_State *L, ngx_http_request_t *r)
|
||||||
ngx_http_lua_inject_req_api_no_io(L);
|
ngx_http_lua_inject_req_api_no_io(L);
|
||||||
ngx_http_lua_inject_resp_header_api(L);
|
ngx_http_lua_inject_resp_header_api(L);
|
||||||
ngx_http_lua_inject_variable_api(L);
|
ngx_http_lua_inject_variable_api(L);
|
||||||
|
ngx_http_lua_inject_shdict_api(lmcf, L);
|
||||||
ngx_http_lua_inject_misc_api(L);
|
ngx_http_lua_inject_misc_api(L);
|
||||||
|
|
||||||
lua_setfield(L, -2, "ngx");
|
lua_setfield(L, -2, "ngx");
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
#include "ngx_http_lua_string.h"
|
#include "ngx_http_lua_string.h"
|
||||||
#include "ngx_http_lua_misc.h"
|
#include "ngx_http_lua_misc.h"
|
||||||
#include "ngx_http_lua_consts.h"
|
#include "ngx_http_lua_consts.h"
|
||||||
|
#include "ngx_http_lua_shdict.h"
|
||||||
|
|
||||||
|
|
||||||
static void ngx_http_lua_inject_arg_api(lua_State *L,
|
static void ngx_http_lua_inject_arg_api(lua_State *L,
|
||||||
|
@ -164,6 +165,10 @@ static void
|
||||||
ngx_http_lua_set_by_lua_env(lua_State *L, ngx_http_request_t *r, size_t nargs,
|
ngx_http_lua_set_by_lua_env(lua_State *L, ngx_http_request_t *r, size_t nargs,
|
||||||
ngx_http_variable_value_t *args)
|
ngx_http_variable_value_t *args)
|
||||||
{
|
{
|
||||||
|
ngx_http_lua_main_conf_t *lmcf;
|
||||||
|
|
||||||
|
lmcf = ngx_http_get_module_main_conf(r, ngx_http_lua_module);
|
||||||
|
|
||||||
/* set nginx request pointer to current lua thread's globals table */
|
/* set nginx request pointer to current lua thread's globals table */
|
||||||
lua_pushlightuserdata(L, r);
|
lua_pushlightuserdata(L, r);
|
||||||
lua_setglobal(L, GLOBALS_SYMBOL_REQUEST);
|
lua_setglobal(L, GLOBALS_SYMBOL_REQUEST);
|
||||||
|
@ -201,6 +206,7 @@ ngx_http_lua_set_by_lua_env(lua_State *L, ngx_http_request_t *r, size_t nargs,
|
||||||
#if (NGX_PCRE)
|
#if (NGX_PCRE)
|
||||||
ngx_http_lua_inject_regex_api(L);
|
ngx_http_lua_inject_regex_api(L);
|
||||||
#endif
|
#endif
|
||||||
|
ngx_http_lua_inject_shdict_api(lmcf, L);
|
||||||
ngx_http_lua_inject_misc_api(L);
|
ngx_http_lua_inject_misc_api(L);
|
||||||
|
|
||||||
lua_setfield(L, -2, "ngx");
|
lua_setfield(L, -2, "ngx");
|
||||||
|
|
|
@ -238,14 +238,12 @@ ngx_http_lua_shdict_expire(ngx_http_lua_shdict_ctx_t *ctx, ngx_uint_t n)
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
ngx_http_lua_inject_shdict_api(ngx_conf_t *cf, lua_State *L)
|
ngx_http_lua_inject_shdict_api(ngx_http_lua_main_conf_t *lmcf, lua_State *L)
|
||||||
{
|
{
|
||||||
ngx_http_lua_main_conf_t *lmcf;
|
|
||||||
ngx_http_lua_shdict_ctx_t *ctx;
|
ngx_http_lua_shdict_ctx_t *ctx;
|
||||||
ngx_uint_t i;
|
ngx_uint_t i;
|
||||||
ngx_shm_zone_t **zone;
|
ngx_shm_zone_t **zone;
|
||||||
|
|
||||||
lmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_lua_module);
|
|
||||||
|
|
||||||
if (lmcf->shm_zones != NULL) {
|
if (lmcf->shm_zones != NULL) {
|
||||||
lua_createtable(L, 0, 1 /* nrec */); /* ngx.shared */
|
lua_createtable(L, 0, 1 /* nrec */); /* ngx.shared */
|
||||||
|
|
|
@ -36,7 +36,8 @@ ngx_int_t ngx_http_lua_shdict_init_zone(ngx_shm_zone_t *shm_zone, void *data);
|
||||||
void ngx_http_lua_shdict_rbtree_insert_value(ngx_rbtree_node_t *temp,
|
void ngx_http_lua_shdict_rbtree_insert_value(ngx_rbtree_node_t *temp,
|
||||||
ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel);
|
ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel);
|
||||||
|
|
||||||
void ngx_http_lua_inject_shdict_api(ngx_conf_t *cf, lua_State *L);
|
void ngx_http_lua_inject_shdict_api(ngx_http_lua_main_conf_t *lmcf,
|
||||||
|
lua_State *L);
|
||||||
|
|
||||||
|
|
||||||
#endif /* NGX_HTTP_LUA_SHDICT_H */
|
#endif /* NGX_HTTP_LUA_SHDICT_H */
|
||||||
|
|
|
@ -500,6 +500,10 @@ init_ngx_lua_registry(ngx_conf_t *cf, lua_State *L)
|
||||||
static void
|
static void
|
||||||
init_ngx_lua_globals(ngx_conf_t *cf, lua_State *L)
|
init_ngx_lua_globals(ngx_conf_t *cf, lua_State *L)
|
||||||
{
|
{
|
||||||
|
ngx_http_lua_main_conf_t *lmcf;
|
||||||
|
|
||||||
|
lmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_lua_module);
|
||||||
|
|
||||||
ngx_log_debug0(NGX_LOG_DEBUG_HTTP, cf->log, 0,
|
ngx_log_debug0(NGX_LOG_DEBUG_HTTP, cf->log, 0,
|
||||||
"lua initializing lua globals");
|
"lua initializing lua globals");
|
||||||
|
|
||||||
|
@ -529,7 +533,7 @@ init_ngx_lua_globals(ngx_conf_t *cf, lua_State *L)
|
||||||
ngx_http_lua_inject_req_api(L);
|
ngx_http_lua_inject_req_api(L);
|
||||||
ngx_http_lua_inject_resp_header_api(L);
|
ngx_http_lua_inject_resp_header_api(L);
|
||||||
ngx_http_lua_inject_variable_api(L);
|
ngx_http_lua_inject_variable_api(L);
|
||||||
ngx_http_lua_inject_shdict_api(cf, L);
|
ngx_http_lua_inject_shdict_api(lmcf, L);
|
||||||
ngx_http_lua_inject_misc_api(L);
|
ngx_http_lua_inject_misc_api(L);
|
||||||
|
|
||||||
lua_getglobal(L, "package"); /* ngx package */
|
lua_getglobal(L, "package"); /* ngx package */
|
||||||
|
|
|
@ -8,7 +8,7 @@ use Test::Nginx::Socket;
|
||||||
|
|
||||||
#repeat_each(2);
|
#repeat_each(2);
|
||||||
|
|
||||||
plan tests => repeat_each() * (blocks() * 2 + 4);
|
plan tests => repeat_each() * (blocks() * 2 + 5);
|
||||||
|
|
||||||
#no_diff();
|
#no_diff();
|
||||||
no_long_string();
|
no_long_string();
|
||||||
|
@ -462,3 +462,91 @@ GET /test
|
||||||
--- response_body_like
|
--- response_body_like
|
||||||
^abort at (?:139|142)$
|
^abort at (?:139|142)$
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
=== TEST 19: string key, int value (write_by_lua)
|
||||||
|
--- http_config
|
||||||
|
lua_shared_dict dogs 1m;
|
||||||
|
--- config
|
||||||
|
location = /test {
|
||||||
|
rewrite_by_lua '
|
||||||
|
local dogs = ngx.shared.dogs
|
||||||
|
dogs:set("foo", 32)
|
||||||
|
dogs:set("bah", 10502)
|
||||||
|
local val = dogs:get("foo")
|
||||||
|
ngx.say(val, " ", type(val))
|
||||||
|
val = dogs:get("bah")
|
||||||
|
ngx.say(val, " ", type(val))
|
||||||
|
';
|
||||||
|
content_by_lua return;
|
||||||
|
}
|
||||||
|
--- request
|
||||||
|
GET /test
|
||||||
|
--- response_body
|
||||||
|
32 number
|
||||||
|
10502 number
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
=== TEST 20: string key, int value (access_by_lua)
|
||||||
|
--- http_config
|
||||||
|
lua_shared_dict dogs 1m;
|
||||||
|
--- config
|
||||||
|
location = /test {
|
||||||
|
access_by_lua '
|
||||||
|
local dogs = ngx.shared.dogs
|
||||||
|
dogs:set("foo", 32)
|
||||||
|
dogs:set("bah", 10502)
|
||||||
|
local val = dogs:get("foo")
|
||||||
|
ngx.say(val, " ", type(val))
|
||||||
|
val = dogs:get("bah")
|
||||||
|
ngx.say(val, " ", type(val))
|
||||||
|
';
|
||||||
|
content_by_lua return;
|
||||||
|
}
|
||||||
|
--- request
|
||||||
|
GET /test
|
||||||
|
--- response_body
|
||||||
|
32 number
|
||||||
|
10502 number
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
=== TEST 21: string key, int value (set_by_lua)
|
||||||
|
--- http_config
|
||||||
|
lua_shared_dict dogs 1m;
|
||||||
|
--- config
|
||||||
|
location = /test {
|
||||||
|
set_by_lua $res '
|
||||||
|
local dogs = ngx.shared.dogs
|
||||||
|
dogs:set("foo", 32)
|
||||||
|
return dogs:get("foo")
|
||||||
|
';
|
||||||
|
echo $res;
|
||||||
|
}
|
||||||
|
--- request
|
||||||
|
GET /test
|
||||||
|
--- response_body
|
||||||
|
32
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
=== TEST 21: string key, int value (header_by_lua)
|
||||||
|
--- http_config
|
||||||
|
lua_shared_dict dogs 1m;
|
||||||
|
--- config
|
||||||
|
location = /test {
|
||||||
|
echo hello;
|
||||||
|
header_filter_by_lua '
|
||||||
|
local dogs = ngx.shared.dogs
|
||||||
|
dogs:set("foo", 32)
|
||||||
|
ngx.header["X-Foo"] = dogs:get("foo")
|
||||||
|
';
|
||||||
|
}
|
||||||
|
--- request
|
||||||
|
GET /test
|
||||||
|
--- response_headers
|
||||||
|
X-Foo: 32
|
||||||
|
--- response_body
|
||||||
|
hello
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче