@@ -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