Skip to content

Commit 97f0101

Browse files
tmthrgdthibaultcha
authored andcommitted
feature: enabled the 'ngx.thread' and 'ngx.socket.udp' APIs in ssl_session_fetch_by_lua*.
Signed-off-by: Thibault Charbonnier <[email protected]>
1 parent 97431d8 commit 97f0101

5 files changed

+303
-6
lines changed

README.markdown

+1-1
Original file line numberDiff line numberDiff line change
@@ -8045,7 +8045,7 @@ ngx.thread.kill
80458045

80468046
**syntax:** *ok, err = ngx.thread.kill(thread)*
80478047

8048-
**context:** *rewrite_by_lua&#42;, access_by_lua&#42;, content_by_lua&#42;, ngx.timer.&#42;*
8048+
**context:** *rewrite_by_lua&#42;, access_by_lua&#42;, content_by_lua&#42;, ngx.timer.&#42;, ssl_certificate_by_lua&#42;, ssl_session_fetch_by_lua&#42;*
80498049

80508050
Kills a running "light thread" created by [ngx.thread.spawn](#ngxthreadspawn). Returns a true value when successful or `nil` and a string describing the error otherwise.
80518051

doc/HttpLuaModule.wiki

+1-1
Original file line numberDiff line numberDiff line change
@@ -6869,7 +6869,7 @@ This API was first enabled in the <code>v0.7.0</code> release.
68696869
68706870
'''syntax:''' ''ok, err = ngx.thread.kill(thread)''
68716871
6872-
'''context:''' ''rewrite_by_lua*, access_by_lua*, content_by_lua*, ngx.timer.*''
6872+
'''context:''' ''rewrite_by_lua*, access_by_lua*, content_by_lua*, ngx.timer.*, ssl_certificate_by_lua*, ssl_session_fetch_by_lua*''
68736873
68746874
Kills a running "light thread" created by [[#ngx.thread.spawn|ngx.thread.spawn]]. Returns a true value when successful or <code>nil</code> and a string describing the error otherwise.
68756875

src/ngx_http_lua_socket_udp.c

+4-2
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,8 @@ ngx_http_lua_socket_udp(lua_State *L)
143143
| NGX_HTTP_LUA_CONTEXT_ACCESS
144144
| NGX_HTTP_LUA_CONTEXT_CONTENT
145145
| NGX_HTTP_LUA_CONTEXT_TIMER
146-
| NGX_HTTP_LUA_CONTEXT_SSL_CERT);
146+
| NGX_HTTP_LUA_CONTEXT_SSL_CERT
147+
| NGX_HTTP_LUA_CONTEXT_SSL_SESS_FETCH);
147148

148149
lua_createtable(L, 3 /* narr */, 1 /* nrec */);
149150
lua_pushlightuserdata(L, ngx_http_lua_lightudata_mask(
@@ -205,7 +206,8 @@ ngx_http_lua_socket_udp_setpeername(lua_State *L)
205206
| NGX_HTTP_LUA_CONTEXT_ACCESS
206207
| NGX_HTTP_LUA_CONTEXT_CONTENT
207208
| NGX_HTTP_LUA_CONTEXT_TIMER
208-
| NGX_HTTP_LUA_CONTEXT_SSL_CERT);
209+
| NGX_HTTP_LUA_CONTEXT_SSL_CERT
210+
| NGX_HTTP_LUA_CONTEXT_SSL_SESS_FETCH);
209211

210212
luaL_checktype(L, 1, LUA_TTABLE);
211213

src/ngx_http_lua_uthread.c

+4-2
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,8 @@ ngx_http_lua_uthread_wait(lua_State *L)
128128
| NGX_HTTP_LUA_CONTEXT_ACCESS
129129
| NGX_HTTP_LUA_CONTEXT_CONTENT
130130
| NGX_HTTP_LUA_CONTEXT_TIMER
131-
| NGX_HTTP_LUA_CONTEXT_SSL_CERT);
131+
| NGX_HTTP_LUA_CONTEXT_SSL_CERT
132+
| NGX_HTTP_LUA_CONTEXT_SSL_SESS_FETCH);
132133

133134
coctx = ctx->cur_co_ctx;
134135

@@ -226,7 +227,8 @@ ngx_http_lua_uthread_kill(lua_State *L)
226227
| NGX_HTTP_LUA_CONTEXT_ACCESS
227228
| NGX_HTTP_LUA_CONTEXT_CONTENT
228229
| NGX_HTTP_LUA_CONTEXT_TIMER
229-
| NGX_HTTP_LUA_CONTEXT_SSL_CERT);
230+
| NGX_HTTP_LUA_CONTEXT_SSL_CERT
231+
| NGX_HTTP_LUA_CONTEXT_SSL_SESS_FETCH);
230232

231233
coctx = ctx->cur_co_ctx;
232234

t/143-ssl-session-fetch.t

+293
Original file line numberDiff line numberDiff line change
@@ -1429,3 +1429,296 @@ qr/elapsed in ssl_session_fetch_by_lua\*: 0\.(?:09|1[01])\d+,/,
14291429
[error]
14301430
[alert]
14311431
[emerg]
1432+
1433+
1434+
1435+
=== TEST 18: cosocket (UDP)
1436+
--- http_config
1437+
ssl_session_fetch_by_lua_block {
1438+
local sock = ngx.socket.udp()
1439+
1440+
sock:settimeout(1000)
1441+
1442+
local ok, err = sock:setpeername("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)
1443+
if not ok then
1444+
ngx.log(ngx.ERR, "failed to connect to memc: ", err)
1445+
return
1446+
end
1447+
1448+
local req = "\0\1\0\0\0\1\0\0flush_all\r\n"
1449+
local ok, err = sock:send(req)
1450+
if not ok then
1451+
ngx.log(ngx.ERR, "failed to send flush_all to memc: ", err)
1452+
return
1453+
end
1454+
1455+
local res, err = sock:receive()
1456+
if not res then
1457+
ngx.log(ngx.ERR, "failed to receive memc reply: ", err)
1458+
return
1459+
end
1460+
1461+
ngx.log(ngx.INFO, "received memc reply of ", #res, " bytes")
1462+
}
1463+
1464+
server {
1465+
listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;
1466+
server_name test.com;
1467+
ssl_certificate $TEST_NGINX_CERT_DIR/cert/test.crt;
1468+
ssl_certificate_key $TEST_NGINX_CERT_DIR/cert/test.key;
1469+
ssl_session_tickets off;
1470+
server_tokens off;
1471+
}
1472+
--- config
1473+
server_tokens off;
1474+
lua_ssl_trusted_certificate $TEST_NGINX_CERT_DIR/cert/test.crt;
1475+
1476+
location /t {
1477+
content_by_lua_block {
1478+
do
1479+
local sock = ngx.socket.tcp()
1480+
1481+
sock:settimeout(5000)
1482+
1483+
local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")
1484+
if not ok then
1485+
ngx.say("failed to connect: ", err)
1486+
return
1487+
end
1488+
1489+
ngx.say("connected: ", ok)
1490+
1491+
local sess, err = sock:sslhandshake(package.loaded.session, "test.com", true)
1492+
if not sess then
1493+
ngx.say("failed to do SSL handshake: ", err)
1494+
return
1495+
end
1496+
1497+
ngx.say("ssl handshake: ", type(sess))
1498+
1499+
package.loaded.session = sess
1500+
1501+
local ok, err = sock:close()
1502+
ngx.say("close: ", ok, " ", err)
1503+
end -- do
1504+
-- collectgarbage()
1505+
}
1506+
}
1507+
--- request
1508+
GET /t
1509+
--- response_body
1510+
connected: 1
1511+
ssl handshake: userdata
1512+
close: 1 nil
1513+
--- grep_error_log eval: qr/received memc reply of \d+ bytes/
1514+
--- grep_error_log_out eval
1515+
[
1516+
'',
1517+
'received memc reply of 12 bytes
1518+
',
1519+
'received memc reply of 12 bytes
1520+
',
1521+
]
1522+
--- no_error_log
1523+
[alert]
1524+
[error]
1525+
[emerg]
1526+
1527+
1528+
1529+
=== TEST 19: uthread (kill)
1530+
--- http_config
1531+
ssl_session_fetch_by_lua_block {
1532+
local function f()
1533+
ngx.log(ngx.INFO, "uthread: hello from f()")
1534+
ngx.sleep(1)
1535+
end
1536+
1537+
local t, err = ngx.thread.spawn(f)
1538+
if not t then
1539+
ngx.log(ngx.ERR, "failed to spawn thread: ", err)
1540+
return
1541+
end
1542+
1543+
collectgarbage()
1544+
1545+
local ok, err = ngx.thread.kill(t)
1546+
if not ok then
1547+
ngx.log(ngx.ERR, "failed to kill thread: ", err)
1548+
return
1549+
end
1550+
1551+
ngx.log(ngx.INFO, "uthread: killed")
1552+
1553+
local ok, err = ngx.thread.kill(t)
1554+
if not ok then
1555+
ngx.log(ngx.INFO, "uthread: failed to kill: ", err)
1556+
end
1557+
}
1558+
1559+
server {
1560+
listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;
1561+
server_name test.com;
1562+
ssl_certificate $TEST_NGINX_CERT_DIR/cert/test.crt;
1563+
ssl_certificate_key $TEST_NGINX_CERT_DIR/cert/test.key;
1564+
ssl_session_tickets off;
1565+
server_tokens off;
1566+
}
1567+
--- config
1568+
server_tokens off;
1569+
lua_ssl_trusted_certificate $TEST_NGINX_CERT_DIR/cert/test.crt;
1570+
1571+
location /t {
1572+
content_by_lua_block {
1573+
do
1574+
local sock = ngx.socket.tcp()
1575+
1576+
sock:settimeout(5000)
1577+
1578+
local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")
1579+
if not ok then
1580+
ngx.say("failed to connect: ", err)
1581+
return
1582+
end
1583+
1584+
ngx.say("connected: ", ok)
1585+
1586+
local sess, err = sock:sslhandshake(package.loaded.session, "test.com", true)
1587+
if not sess then
1588+
ngx.say("failed to do SSL handshake: ", err)
1589+
return
1590+
end
1591+
1592+
ngx.say("ssl handshake: ", type(sess))
1593+
1594+
package.loaded.session = sess
1595+
1596+
local ok, err = sock:close()
1597+
ngx.say("close: ", ok, " ", err)
1598+
end -- do
1599+
-- collectgarbage()
1600+
}
1601+
}
1602+
--- request
1603+
GET /t
1604+
--- response_body
1605+
connected: 1
1606+
ssl handshake: userdata
1607+
close: 1 nil
1608+
--- grep_error_log eval: qr/uthread: [^.,]+/
1609+
--- grep_error_log_out eval
1610+
[
1611+
'',
1612+
'uthread: hello from f()
1613+
uthread: killed
1614+
uthread: failed to kill: already waited or killed
1615+
',
1616+
'uthread: hello from f()
1617+
uthread: killed
1618+
uthread: failed to kill: already waited or killed
1619+
'
1620+
]
1621+
--- no_error_log
1622+
[alert]
1623+
[error]
1624+
[emerg]
1625+
1626+
1627+
1628+
=== TEST 20: uthread (wait)
1629+
--- http_config
1630+
ssl_session_fetch_by_lua_block {
1631+
local function f()
1632+
ngx.log(ngx.INFO, "uthread: hello from f()")
1633+
ngx.sleep(0.001)
1634+
return 32
1635+
end
1636+
1637+
local t, err = ngx.thread.spawn(f)
1638+
if not t then
1639+
ngx.log(ngx.ERR, "failed to spawn thread: ", err)
1640+
return
1641+
end
1642+
1643+
collectgarbage()
1644+
1645+
local ok, res = ngx.thread.wait(t)
1646+
if not ok then
1647+
ngx.log(ngx.ERR, "failed to wait on thread: ", res)
1648+
return
1649+
end
1650+
1651+
ngx.log(ngx.INFO, "uthread: ", res)
1652+
1653+
local ok, err = ngx.thread.kill(t)
1654+
if not ok then
1655+
ngx.log(ngx.INFO, "uthread: failed to kill: ", err)
1656+
end
1657+
}
1658+
1659+
server {
1660+
listen unix:$TEST_NGINX_HTML_DIR/nginx.sock ssl;
1661+
server_name test.com;
1662+
ssl_certificate $TEST_NGINX_CERT_DIR/cert/test.crt;
1663+
ssl_certificate_key $TEST_NGINX_CERT_DIR/cert/test.key;
1664+
ssl_session_tickets off;
1665+
server_tokens off;
1666+
}
1667+
--- config
1668+
server_tokens off;
1669+
lua_ssl_trusted_certificate $TEST_NGINX_CERT_DIR/cert/test.crt;
1670+
1671+
location /t {
1672+
content_by_lua_block {
1673+
do
1674+
local sock = ngx.socket.tcp()
1675+
1676+
sock:settimeout(5000)
1677+
1678+
local ok, err = sock:connect("unix:$TEST_NGINX_HTML_DIR/nginx.sock")
1679+
if not ok then
1680+
ngx.say("failed to connect: ", err)
1681+
return
1682+
end
1683+
1684+
ngx.say("connected: ", ok)
1685+
1686+
local sess, err = sock:sslhandshake(package.loaded.session, "test.com", true)
1687+
if not sess then
1688+
ngx.say("failed to do SSL handshake: ", err)
1689+
return
1690+
end
1691+
1692+
ngx.say("ssl handshake: ", type(sess))
1693+
1694+
package.loaded.session = sess
1695+
1696+
local ok, err = sock:close()
1697+
ngx.say("close: ", ok, " ", err)
1698+
end -- do
1699+
-- collectgarbage()
1700+
}
1701+
}
1702+
--- request
1703+
GET /t
1704+
--- response_body
1705+
connected: 1
1706+
ssl handshake: userdata
1707+
close: 1 nil
1708+
--- grep_error_log eval: qr/uthread: [^.,]+/
1709+
--- grep_error_log_out eval
1710+
[
1711+
'',
1712+
'uthread: hello from f()
1713+
uthread: 32
1714+
uthread: failed to kill: already waited or killed
1715+
',
1716+
'uthread: hello from f()
1717+
uthread: 32
1718+
uthread: failed to kill: already waited or killed
1719+
'
1720+
]
1721+
--- no_error_log
1722+
[alert]
1723+
[error]
1724+
[emerg]

0 commit comments

Comments
 (0)