Skip to content

Commit 5fec393

Browse files
committed
feature: enabled the FFI-based API for 'ngx.ctx' and 'ngx.status' in the stream subsystem.
1 parent 8a381c1 commit 5fec393

File tree

3 files changed

+113
-81
lines changed

3 files changed

+113
-81
lines changed

lib/resty/core.lua

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
local subsystem = ngx.config.subsystem
44

55

6+
require "resty.core.ctx"
67
require "resty.core.regex"
78
require "resty.core.shdict"
89
require "resty.core.time"
@@ -15,7 +16,6 @@ require "resty.core.base64"
1516

1617
if subsystem == 'http' then
1718
require "resty.core.var"
18-
require "resty.core.ctx"
1919
require "resty.core.request"
2020
require "resty.core.response"
2121
require "resty.core.worker"

lib/resty/core/ctx.lua

Lines changed: 30 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,47 @@
11
-- Copyright (C) Yichun Zhang (agentzh)
22

33

4-
local ffi = require 'ffi'
5-
local debug = require 'debug'
4+
local ffi = require "ffi"
5+
local debug = require "debug"
66
local base = require "resty.core.base"
77
local misc = require "resty.core.misc"
88

99

10+
local C = ffi.C
1011
local register_getter = misc.register_ngx_magic_key_getter
1112
local register_setter = misc.register_ngx_magic_key_setter
1213
local registry = debug.getregistry()
1314
local new_tab = base.new_tab
1415
local ref_in_table = base.ref_in_table
1516
local get_request = base.get_request
16-
local C = ffi.C
1717
local FFI_NO_REQ_CTX = base.FFI_NO_REQ_CTX
1818
local FFI_OK = base.FFI_OK
1919
local error = error
20+
local subsystem = ngx.config.subsystem
21+
22+
23+
local ngx_lua_ffi_get_ctx_ref
24+
local ngx_lua_ffi_set_ctx_ref
2025

2126

22-
ffi.cdef[[
23-
int ngx_http_lua_ffi_get_ctx_ref(ngx_http_request_t *r);
24-
int ngx_http_lua_ffi_set_ctx_ref(ngx_http_request_t *r, int ref);
25-
]]
27+
if subsystem == "http" then
28+
ffi.cdef[[
29+
int ngx_http_lua_ffi_get_ctx_ref(ngx_http_request_t *r);
30+
int ngx_http_lua_ffi_set_ctx_ref(ngx_http_request_t *r, int ref);
31+
]]
32+
33+
ngx_lua_ffi_get_ctx_ref = C.ngx_http_lua_ffi_get_ctx_ref
34+
ngx_lua_ffi_set_ctx_ref = C.ngx_http_lua_ffi_set_ctx_ref
35+
36+
elseif subsystem == "stream" then
37+
ffi.cdef[[
38+
int ngx_stream_lua_ffi_get_ctx_ref(ngx_stream_lua_request_t *r);
39+
int ngx_stream_lua_ffi_set_ctx_ref(ngx_stream_lua_request_t *r, int ref);
40+
]]
41+
42+
ngx_lua_ffi_get_ctx_ref = C.ngx_stream_lua_ffi_get_ctx_ref
43+
ngx_lua_ffi_set_ctx_ref = C.ngx_stream_lua_ffi_set_ctx_ref
44+
end
2645

2746

2847
local _M = {
@@ -37,7 +56,7 @@ local function get_ctx_table()
3756
error("no request found")
3857
end
3958

40-
local ctx_ref = C.ngx_http_lua_ffi_get_ctx_ref(r)
59+
local ctx_ref = ngx_lua_ffi_get_ctx_ref(r)
4160
if ctx_ref == FFI_NO_REQ_CTX then
4261
error("no request ctx found")
4362
end
@@ -46,7 +65,7 @@ local function get_ctx_table()
4665
if ctx_ref < 0 then
4766
local ctx = new_tab(0, 4)
4867
ctx_ref = ref_in_table(ctxs, ctx)
49-
if C.ngx_http_lua_ffi_set_ctx_ref(r, ctx_ref) ~= FFI_OK then
68+
if ngx_lua_ffi_set_ctx_ref(r, ctx_ref) ~= FFI_OK then
5069
return nil
5170
end
5271
return ctx
@@ -63,15 +82,15 @@ local function set_ctx_table(ctx)
6382
error("no request found")
6483
end
6584

66-
local ctx_ref = C.ngx_http_lua_ffi_get_ctx_ref(r)
85+
local ctx_ref = ngx_lua_ffi_get_ctx_ref(r)
6786
if ctx_ref == FFI_NO_REQ_CTX then
6887
error("no request ctx found")
6988
end
7089

7190
local ctxs = registry.ngx_lua_ctx_tables
7291
if ctx_ref < 0 then
7392
ctx_ref = ref_in_table(ctxs, ctx)
74-
C.ngx_http_lua_ffi_set_ctx_ref(r, ctx_ref)
93+
ngx_lua_ffi_set_ctx_ref(r, ctx_ref)
7594
return
7695
end
7796
ctxs[ctx_ref] = ctx

lib/resty/core/misc.lua

Lines changed: 82 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -6,107 +6,98 @@ local ffi = require "ffi"
66
local os = require "os"
77

88

9-
local FFI_OK = base.FFI_OK
10-
local FFI_NO_REQ_CTX = base.FFI_NO_REQ_CTX
11-
local FFI_BAD_CONTEXT = base.FFI_BAD_CONTEXT
12-
local get_string_buf = base.get_string_buf
13-
local get_string_buf_size = base.get_string_buf_size
14-
local get_size_ptr = base.get_size_ptr
15-
local new_tab = base.new_tab
169
local C = ffi.C
1710
local ffi_new = ffi.new
1811
local ffi_str = ffi.string
19-
local setmetatable = setmetatable
20-
local rawget = rawget
21-
local rawset = rawset
2212
local ngx = ngx
23-
local get_request = base.get_request
2413
local type = type
2514
local error = error
15+
local rawget = rawget
16+
local rawset = rawset
2617
local tonumber = tonumber
18+
local setmetatable = setmetatable
19+
local FFI_OK = base.FFI_OK
20+
local FFI_NO_REQ_CTX = base.FFI_NO_REQ_CTX
21+
local FFI_BAD_CONTEXT = base.FFI_BAD_CONTEXT
22+
local new_tab = base.new_tab
23+
local get_request = base.get_request
24+
local get_size_ptr = base.get_size_ptr
25+
local get_string_buf = base.get_string_buf
26+
local get_string_buf_size = base.get_string_buf_size
2727
local subsystem = ngx.config.subsystem
2828

2929

30-
local _M
30+
local ngx_lua_ffi_get_resp_status
3131
local ngx_lua_ffi_get_conf_env
32+
local ngx_magic_key_getters
33+
local ngx_magic_key_setters
3234

3335

34-
if subsystem == 'http' then
35-
_M = new_tab(0, 3)
36+
local _M = new_tab(0, 3)
37+
local ngx_mt = new_tab(0, 2)
3638

3739

38-
local ngx_magic_key_getters = new_tab(0, 4)
39-
local ngx_magic_key_setters = new_tab(0, 2)
40+
if subsystem == "http" then
41+
ngx_magic_key_getters = new_tab(0, 4)
42+
ngx_magic_key_setters = new_tab(0, 2)
4043

41-
42-
local function register_getter(key, func)
43-
ngx_magic_key_getters[key] = func
44-
end
45-
_M.register_ngx_magic_key_getter = register_getter
44+
elseif subsystem == "stream" then
45+
ngx_magic_key_getters = new_tab(0, 2)
46+
ngx_magic_key_setters = new_tab(0, 1)
47+
end
4648

4749

48-
local function register_setter(key, func)
49-
ngx_magic_key_setters[key] = func
50-
end
51-
_M.register_ngx_magic_key_setter = register_setter
50+
local function register_getter(key, func)
51+
ngx_magic_key_getters[key] = func
52+
end
53+
_M.register_ngx_magic_key_getter = register_getter
5254

5355

54-
local mt = new_tab(0, 2)
56+
local function register_setter(key, func)
57+
ngx_magic_key_setters[key] = func
58+
end
59+
_M.register_ngx_magic_key_setter = register_setter
5560

5661

57-
mt.__index = function (tb, key)
58-
local f = ngx_magic_key_getters[key]
59-
if f then
60-
return f()
61-
end
62-
return rawget(tb, key)
62+
ngx_mt.__index = function (tb, key)
63+
local f = ngx_magic_key_getters[key]
64+
if f then
65+
return f()
6366
end
67+
return rawget(tb, key)
68+
end
6469

6570

66-
mt.__newindex = function (tb, key, ctx)
67-
local f = ngx_magic_key_setters[key]
68-
if f then
69-
return f(ctx)
70-
end
71-
return rawset(tb, key, ctx)
71+
ngx_mt.__newindex = function (tb, key, ctx)
72+
local f = ngx_magic_key_setters[key]
73+
if f then
74+
return f(ctx)
7275
end
76+
return rawset(tb, key, ctx)
77+
end
7378

7479

75-
setmetatable(ngx, mt)
80+
setmetatable(ngx, ngx_mt)
7681

7782

83+
if subsystem == "http" then
7884
ffi.cdef[[
79-
int ngx_http_lua_ffi_get_resp_status(ngx_http_request_t *r);
80-
int ngx_http_lua_ffi_set_resp_status(ngx_http_request_t *r, int r);
81-
int ngx_http_lua_ffi_is_subrequest(ngx_http_request_t *r);
82-
int ngx_http_lua_ffi_headers_sent(ngx_http_request_t *r);
83-
int ngx_http_lua_ffi_get_conf_env(const unsigned char *name,
84-
unsigned char **env_buf, size_t *name_len);
85+
int ngx_http_lua_ffi_get_resp_status(ngx_http_request_t *r);
86+
int ngx_http_lua_ffi_set_resp_status(ngx_http_request_t *r, int r);
87+
int ngx_http_lua_ffi_is_subrequest(ngx_http_request_t *r);
88+
int ngx_http_lua_ffi_headers_sent(ngx_http_request_t *r);
89+
int ngx_http_lua_ffi_get_conf_env(const unsigned char *name,
90+
unsigned char **env_buf,
91+
size_t *name_len);
8592
]]
8693

8794

95+
ngx_lua_ffi_get_resp_status = C.ngx_http_lua_ffi_get_resp_status
8896
ngx_lua_ffi_get_conf_env = C.ngx_http_lua_ffi_get_conf_env
8997

9098

9199
-- ngx.status
92100

93-
local function get_status()
94-
local r = get_request()
95-
96-
if not r then
97-
error("no request found")
98-
end
99-
100-
local rc = C.ngx_http_lua_ffi_get_resp_status(r)
101-
102-
if rc == FFI_BAD_CONTEXT then
103-
error("API disabled in the current context", 2)
104-
end
105-
106-
return rc
107-
end
108-
register_getter("status", get_status)
109-
110101

111102
local function set_status(status)
112103
local r = get_request()
@@ -132,6 +123,7 @@ int ngx_http_lua_ffi_get_conf_env(const unsigned char *name,
132123

133124
-- ngx.is_subrequest
134125

126+
135127
local function is_subreq()
136128
local r = get_request()
137129

@@ -152,6 +144,7 @@ int ngx_http_lua_ffi_get_conf_env(const unsigned char *name,
152144

153145
-- ngx.headers_sent
154146

147+
155148
local function headers_sent()
156149
local r = get_request()
157150

@@ -173,20 +166,40 @@ int ngx_http_lua_ffi_get_conf_env(const unsigned char *name,
173166
end
174167
register_getter("headers_sent", headers_sent)
175168

176-
elseif subsystem == 'stream' then
177-
_M = new_tab(0, 1)
178-
179-
169+
elseif subsystem == "stream" then
180170
ffi.cdef[[
181-
int ngx_stream_lua_ffi_get_conf_env(const unsigned char *name,
182-
unsigned char **env_buf, size_t *name_len);
171+
int ngx_stream_lua_ffi_get_resp_status(ngx_stream_lua_request_t *r);
172+
int ngx_stream_lua_ffi_get_conf_env(const unsigned char *name,
173+
unsigned char **env_buf,
174+
size_t *name_len);
183175
]]
184176

185-
177+
ngx_lua_ffi_get_resp_status = C.ngx_stream_lua_ffi_get_resp_status
186178
ngx_lua_ffi_get_conf_env = C.ngx_stream_lua_ffi_get_conf_env
187179
end
188180

189181

182+
-- ngx.status
183+
184+
185+
local function get_status()
186+
local r = get_request()
187+
188+
if not r then
189+
error("no request found")
190+
end
191+
192+
local rc = ngx_lua_ffi_get_resp_status(r)
193+
194+
if rc == FFI_BAD_CONTEXT then
195+
error("API disabled in the current context", 2)
196+
end
197+
198+
return rc
199+
end
200+
register_getter("status", get_status)
201+
202+
190203
do
191204
local _getenv = os.getenv
192205
local env_ptr = ffi_new("unsigned char *[1]")

0 commit comments

Comments
 (0)