Skip to content

Commit 7a40a36

Browse files
feature: enable ngx.var at the ssl_certificate_by_lua and ssl_client_hello_by_lua.
1 parent b22705c commit 7a40a36

File tree

3 files changed

+158
-5
lines changed

3 files changed

+158
-5
lines changed

src/ngx_stream_lua_variable.c

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,27 +32,39 @@ ngx_stream_lua_ffi_var_get(ngx_stream_lua_request_t *r, u_char *name_data,
3232
ngx_uint_t hash;
3333
ngx_str_t name;
3434

35-
ngx_stream_variable_value_t *vv;
35+
ngx_stream_session_t *session;
36+
ngx_stream_lua_ctx_t *ctx;
37+
ngx_stream_lua_ssl_ctx_t *cctx;
38+
ngx_stream_variable_value_t *vv;
3639

3740
if (r == NULL) {
3841
*err = "no request object found";
3942
return NGX_ERROR;
4043
}
4144

45+
session = r->session;
4246
if ((r)->connection->fd == (ngx_socket_t) -1) {
43-
*err = "API disabled in the current context";
44-
return NGX_ERROR;
47+
ctx = ngx_stream_lua_get_module_ctx(r, ngx_stream_lua_module);
48+
if (ctx->context & (NGX_STREAM_LUA_CONTEXT_SSL_CERT
49+
| NGX_STREAM_LUA_CONTEXT_SSL_CLIENT_HELLO))
50+
{
51+
cctx = ngx_stream_lua_ssl_get_ctx(r->connection->ssl->connection);
52+
session = cctx->connection->data;
53+
54+
} else {
55+
*err = "API disabled in the current context";
56+
return NGX_ERROR;
57+
}
4558
}
4659

47-
4860
hash = ngx_hash_strlow(lowcase_buf, name_data, name_len);
4961

5062
name.data = lowcase_buf;
5163
name.len = name_len;
5264

5365
dd("variable name: %.*s", (int) name_len, lowcase_buf);
5466

55-
vv = ngx_stream_get_variable(r->session, &name, hash);
67+
vv = ngx_stream_get_variable(session, &name, hash);
5668

5769
if (vv == NULL || vv->not_found) {
5870
return NGX_DECLINED;

t/139-ssl-cert-by.t

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1787,3 +1787,73 @@ client socket file:
17871787
--- no_error_log
17881788
[error]
17891789
[alert]
1790+
1791+
1792+
1793+
=== TEST 27: call ngx.var
1794+
--- stream_config
1795+
server {
1796+
listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;
1797+
ssl_certificate_by_lua_block {
1798+
ngx.log(ngx.INFO, "hostname:", ngx.var.hostname)
1799+
}
1800+
1801+
ssl_certificate ../../cert/test.crt;
1802+
ssl_certificate_key ../../cert/test.key;
1803+
1804+
return 'it works!\n';
1805+
}
1806+
--- stream_server_config
1807+
lua_ssl_trusted_certificate ../../cert/test.crt;
1808+
1809+
content_by_lua_block {
1810+
do
1811+
local sock = ngx.socket.tcp()
1812+
1813+
sock:settimeout(2000)
1814+
1815+
local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")
1816+
if not ok then
1817+
ngx.say("failed to connect: ", err)
1818+
return
1819+
end
1820+
1821+
ngx.say("connected: ", ok)
1822+
1823+
local sess, err = sock:sslhandshake(nil, "test.com", true)
1824+
if not sess then
1825+
ngx.say("failed to do SSL handshake: ", err)
1826+
return
1827+
end
1828+
1829+
ngx.say("ssl handshake: ", type(sess))
1830+
1831+
while true do
1832+
local line, err = sock:receive()
1833+
if not line then
1834+
-- ngx.say("failed to receive response status line: ", err)
1835+
break
1836+
end
1837+
1838+
ngx.say("received: ", line)
1839+
end
1840+
1841+
local ok, err = sock:close()
1842+
ngx.say("close: ", ok, " ", err)
1843+
end -- do
1844+
-- collectgarbage()
1845+
}
1846+
1847+
--- stream_response
1848+
connected: 1
1849+
ssl handshake: userdata
1850+
received: it works!
1851+
close: 1 nil
1852+
1853+
--- error_log
1854+
lua ssl server name: "test.com"
1855+
1856+
--- no_error_log
1857+
[error]
1858+
[alert]
1859+
[crit]

t/162-ssl-client-hello-by.t

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1806,3 +1806,74 @@ ssl handshake: userdata
18061806
uthread: hello from f()
18071807
uthread: killed
18081808
uthread: failed to kill: already waited or killed
1809+
1810+
1811+
1812+
=== TEST 27: call ngx.var
1813+
--- stream_config
1814+
server {
1815+
listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;
1816+
ssl_client_hello_by_lua_block {
1817+
ngx.log(ngx.INFO, "hostname: ", ngx.var.hostname)
1818+
}
1819+
1820+
ssl_certificate ../../cert/test.crt;
1821+
ssl_certificate_key ../../cert/test.key;
1822+
1823+
return 'it works!\n';
1824+
}
1825+
1826+
--- stream_server_config
1827+
lua_ssl_trusted_certificate ../../cert/test.crt;
1828+
1829+
content_by_lua_block {
1830+
do
1831+
local sock = ngx.socket.tcp()
1832+
1833+
sock:settimeout(2000)
1834+
1835+
local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")
1836+
if not ok then
1837+
ngx.say("failed to connect: ", err)
1838+
return
1839+
end
1840+
1841+
ngx.say("connected: ", ok)
1842+
1843+
local sess, err = sock:sslhandshake(nil, "test.com", true)
1844+
if not sess then
1845+
ngx.say("failed to do SSL handshake: ", err)
1846+
return
1847+
end
1848+
1849+
ngx.say("ssl handshake: ", type(sess))
1850+
1851+
while true do
1852+
local line, err = sock:receive()
1853+
if not line then
1854+
-- ngx.say("failed to receive response status line: ", err)
1855+
break
1856+
end
1857+
1858+
ngx.say("received: ", line)
1859+
end
1860+
1861+
local ok, err = sock:close()
1862+
ngx.say("close: ", ok, " ", err)
1863+
end -- do
1864+
-- collectgarbage()
1865+
}
1866+
1867+
--- stream_response
1868+
connected: 1
1869+
ssl handshake: userdata
1870+
received: it works!
1871+
close: 1 nil
1872+
1873+
--- error_log
1874+
lua ssl server name: "test.com"
1875+
1876+
--- no_error_log
1877+
[error]
1878+
[alert]
1879+
[crit]

0 commit comments

Comments
 (0)