Skip to content

Commit 2921600

Browse files
committed
change: updated to support the ngx_http_lua module without old CFunction APIs.
1 parent 9937f5d commit 2921600

File tree

9 files changed

+89
-114
lines changed

9 files changed

+89
-114
lines changed

.luacheckrc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
std = 'ngx_lua'
2-
globals = { 'ngx' }
2+
globals = { 'ngx', 'ndk' }
33
unused_args = false
44
read_globals = {
55
"coroutine._yield"

lib/resty/core/misc.lua

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@ local new_tab = base.new_tab
1616
local C = ffi.C
1717
local ffi_new = ffi.new
1818
local ffi_str = ffi.string
19-
local getmetatable = getmetatable
19+
local setmetatable = setmetatable
20+
local rawget = rawget
21+
local rawset = rawset
2022
local ngx = ngx
2123
local get_request = base.get_request
2224
local type = type
@@ -49,29 +51,30 @@ if subsystem == 'http' then
4951
_M.register_ngx_magic_key_setter = register_setter
5052

5153

52-
local mt = getmetatable(ngx)
54+
local mt = new_tab(0, 2)
5355

5456

55-
local old_index = mt.__index
5657
mt.__index = function (tb, key)
5758
local f = ngx_magic_key_getters[key]
5859
if f then
5960
return f()
6061
end
61-
return old_index(tb, key)
62+
return rawget(tb, key)
6263
end
6364

6465

65-
local old_newindex = mt.__newindex
6666
mt.__newindex = function (tb, key, ctx)
6767
local f = ngx_magic_key_setters[key]
6868
if f then
6969
return f(ctx)
7070
end
71-
return old_newindex(tb, key, ctx)
71+
return rawset(tb, key, ctx)
7272
end
7373

7474

75+
setmetatable(ngx, mt)
76+
77+
7578
ffi.cdef[[
7679
int ngx_http_lua_ffi_get_resp_status(ngx_http_request_t *r);
7780
int ngx_http_lua_ffi_set_resp_status(ngx_http_request_t *r, int r);

lib/resty/core/ndk.lua

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,10 @@ local ffi_cast = ffi.cast
1111
local ffi_new = ffi.new
1212
local ffi_str = ffi.string
1313
local FFI_OK = base.FFI_OK
14+
local new_tab = base.new_tab
1415
local get_string_buf = base.get_string_buf
1516
local get_request = base.get_request
16-
local getmetatable = getmetatable
17+
local setmetatable = setmetatable
1718
local type = type
1819
local tostring = tostring
1920
local error = error
@@ -79,12 +80,12 @@ local function ndk_set_var_set()
7980
end
8081

8182

82-
do
83-
if ndk then
84-
local mt = getmetatable(ndk.set_var)
85-
mt.__newindex = ndk_set_var_set
86-
mt.__index = ndk_set_var_get
87-
end
83+
if ndk then
84+
local mt = new_tab(0, 2)
85+
mt.__newindex = ndk_set_var_set
86+
mt.__index = ndk_set_var_get
87+
88+
ndk.set_var = setmetatable(new_tab(0, 0), mt)
8889
end
8990

9091

lib/resty/core/regex.lua

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,7 @@ local _M = {
4040
}
4141

4242

43-
if not ngx.re then
44-
ngx.re = {}
45-
end
43+
ngx.re = new_tab(0, 5)
4644

4745

4846
ffi.cdef[[

lib/resty/core/response.lua

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ local FFI_BAD_CONTEXT = base.FFI_BAD_CONTEXT
1313
local FFI_NO_REQ_CTX = base.FFI_NO_REQ_CTX
1414
local FFI_DECLINED = base.FFI_DECLINED
1515
local get_string_buf = base.get_string_buf
16-
local getmetatable = getmetatable
16+
local setmetatable = setmetatable
1717
local type = type
1818
local tostring = tostring
1919
local get_request = base.get_request
@@ -172,9 +172,11 @@ end
172172

173173

174174
do
175-
local mt = getmetatable(ngx.header)
175+
local mt = new_tab(0, 2)
176176
mt.__newindex = set_resp_header
177177
mt.__index = get_resp_header
178+
179+
ngx.header = setmetatable(new_tab(0, 0), mt)
178180
end
179181

180182

lib/resty/core/shdict.lua

Lines changed: 31 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,17 @@
44
local ffi = require 'ffi'
55
local base = require "resty.core.base"
66

7+
8+
local _M = {
9+
version = base.version
10+
}
11+
12+
local ngx_shared = ngx.shared
13+
if not ngx_shared then
14+
return _M
15+
end
16+
17+
718
local ffi_new = ffi.new
819
local ffi_str = ffi.string
920
local C = ffi.C
@@ -15,7 +26,6 @@ local tostring = tostring
1526
local next = next
1627
local type = type
1728
local error = error
18-
local ngx_shared = ngx.shared
1929
local getmetatable = getmetatable
2030
local FFI_DECLINED = base.FFI_DECLINED
2131
local subsystem = ngx.config.subsystem
@@ -600,33 +610,29 @@ else
600610
end
601611

602612

603-
if ngx_shared then
604-
local _, dict = next(ngx_shared, nil)
605-
if dict then
606-
local mt = getmetatable(dict)
613+
local _, dict = next(ngx_shared, nil)
614+
if dict then
615+
local mt = getmetatable(dict)
616+
if mt then
617+
mt = mt.__index
607618
if mt then
608-
mt = mt.__index
609-
if mt then
610-
mt.get = shdict_get
611-
mt.get_stale = shdict_get_stale
612-
mt.incr = shdict_incr
613-
mt.set = shdict_set
614-
mt.safe_set = shdict_safe_set
615-
mt.add = shdict_add
616-
mt.safe_add = shdict_safe_add
617-
mt.replace = shdict_replace
618-
mt.delete = shdict_delete
619-
mt.flush_all = shdict_flush_all
620-
mt.ttl = shdict_ttl
621-
mt.expire = shdict_expire
622-
mt.capacity = shdict_capacity
623-
mt.free_space = shdict_free_space
624-
end
619+
mt.get = shdict_get
620+
mt.get_stale = shdict_get_stale
621+
mt.incr = shdict_incr
622+
mt.set = shdict_set
623+
mt.safe_set = shdict_safe_set
624+
mt.add = shdict_add
625+
mt.safe_add = shdict_safe_add
626+
mt.replace = shdict_replace
627+
mt.delete = shdict_delete
628+
mt.flush_all = shdict_flush_all
629+
mt.ttl = shdict_ttl
630+
mt.expire = shdict_expire
631+
mt.capacity = shdict_capacity
632+
mt.free_space = shdict_free_space
625633
end
626634
end
627635
end
628636

629637

630-
return {
631-
version = base.version
632-
}
638+
return _M

lib/resty/core/var.lua

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,17 @@ local type = type
1111
local get_request = base.get_request
1212
local get_string_buf = base.get_string_buf
1313
local get_size_ptr = base.get_size_ptr
14+
local new_tab = base.new_tab
1415
local error = error
1516
local tostring = tostring
16-
local ngx_var = ngx.var
17-
local getmetatable = getmetatable
17+
local setmetatable = setmetatable
1818

1919
local ERR_BUF_SIZE = 256
2020

2121

22+
ngx.var = new_tab(0, 0)
23+
24+
2225
ffi.cdef[[
2326
int ngx_http_lua_ffi_var_get(ngx_http_request_t *r,
2427
const char *name_data, size_t name_len, char *lowcase_buf,
@@ -116,12 +119,12 @@ local function var_set(self, name, value)
116119
end
117120

118121

119-
if ngx_var then
120-
local mt = getmetatable(ngx_var)
121-
if mt then
122-
mt.__index = var_get
123-
mt.__newindex = var_set
124-
end
122+
do
123+
local mt = new_tab(0, 2)
124+
mt.__index = var_get
125+
mt.__newindex = var_set
126+
127+
setmetatable(ngx.var, mt)
125128
end
126129

127130

lib/resty/core/worker.lua

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@ local base = require "resty.core.base"
66

77

88
local C = ffi.C
9+
local new_tab = base.new_tab
10+
11+
12+
ngx.worker = new_tab(0, 4)
913

1014

1115
ffi.cdef[[

t/os-getenv.t

Lines changed: 20 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
use lib '.';
33
use t::TestCore;
44

5-
plan tests => repeat_each() * (blocks() * 3 + 2);
5+
plan tests => repeat_each() * (blocks() * 3 + 1);
66

77
add_block_preprocessor(sub {
88
my $block = shift;
@@ -180,85 +180,40 @@ in content:\s+
180180
181181
182182
=== TEST 8: os.getenv() overwrite is reverted in worker phases
183-
--- http_config
184-
lua_package_path "$TEST_NGINX_LUA_PACKAGE_PATH";
185-
lua_load_resty_core off;
186-
187-
init_by_lua_block {
188-
package.loaded.os_getenv = os.getenv
189-
require "resty.core"
190-
package.loaded.is_os_getenv = os.getenv == package.loaded.os_getenv
191-
}
192-
--- config
193-
location /t {
194-
content_by_lua_block {
195-
os.getenv("")
196-
197-
ngx.say("in init: ", package.loaded.is_os_getenv, "\n",
198-
"in content: ", os.getenv == package.loaded.os_getenv)
199-
}
200-
}
201-
--- response_body
202-
in init: false
203-
in content: true
204-
205-
206-
207-
=== TEST 9: os.getenv() can be localized before loading resty.core
208183
--- main_config
209184
env FOO=hello;
210185
--- http_config
211186
lua_package_path "$TEST_NGINX_LUA_PACKAGE_PATH";
212-
lua_load_resty_core off;
213187
214188
init_by_lua_block {
215-
package.loaded.os_getenv = os.getenv
216-
require "resty.core"
217-
218-
do
219-
local getenv = os.getenv
220-
221-
package.loaded.f = function ()
222-
ngx.log(ngx.NOTICE, "FOO: ", getenv("FOO"))
223-
end
224-
end
225-
226-
package.loaded.f()
227-
228-
package.loaded.is_os_getenv = os.getenv == package.loaded.os_getenv
189+
package.loaded.init_os_getenv = os.getenv
229190
}
230191
--- config
231192
location /t {
232193
content_by_lua_block {
233-
package.loaded.f()
234-
package.loaded.f()
194+
ngx.say("FOO=", os.getenv("FOO"))
195+
196+
if os.getenv ~= package.loaded.init_os_getenv then
197+
ngx.say("os.getenv() overwrite was reverted")
235198
236-
ngx.say("in init: ", package.loaded.is_os_getenv, "\n",
237-
"in content: ", os.getenv == package.loaded.os_getenv)
199+
else
200+
ngx.say("os.getenv() overwrite was not reverted")
201+
end
238202
}
239203
}
240204
--- response_body
241-
in init: false
242-
in content: true
243-
--- grep_error_log eval
244-
qr/FOO: [a-z]+/
245-
--- grep_error_log_out
246-
FOO: hello
247-
FOO: hello
248-
FOO: hello
205+
FOO=hello
206+
os.getenv() overwrite was reverted
249207
250208
251209
252-
=== TEST 10: os.getenv() can be localized after loading resty.core
210+
=== TEST 9: os.getenv() can be localized after loading resty.core
253211
--- main_config
254212
env FOO=hello;
255213
--- http_config
256214
lua_package_path "$TEST_NGINX_LUA_PACKAGE_PATH";
257-
lua_load_resty_core off;
258215
259216
init_by_lua_block {
260-
package.loaded.os_getenv = os.getenv
261-
262217
do
263218
local getenv = os.getenv
264219
@@ -279,16 +234,19 @@ location /t {
279234
package.loaded.f()
280235
package.loaded.f()
281236
282-
ngx.say("in init: ", package.loaded.is_os_getenv, "\n",
283-
"in content: ", os.getenv == package.loaded.os_getenv)
237+
if os.getenv ~= package.loaded.init_os_getenv then
238+
ngx.say("os.getenv() overwrite was reverted")
239+
240+
else
241+
ngx.say("os.getenv() overwrite was not reverted")
242+
end
284243
}
285244
}
286245
--- response_body
287-
in init: false
288-
in content: false
246+
os.getenv() overwrite was reverted
289247
--- grep_error_log eval
290248
qr/FOO: [a-z]+/
291249
--- grep_error_log_out
292-
FOO: nil
250+
FOO: hello
293251
FOO: hello
294252
FOO: hello

0 commit comments

Comments
 (0)