You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficserver.apache.org by ki...@apache.org on 2018/05/08 15:02:39 UTC

[trafficserver] branch master updated (614d8a9 -> 11bf272)

This is an automated email from the ASF dual-hosted git repository.

kichan pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/trafficserver.git.


    from 614d8a9  Fix Dereference of null pointer in HashMap
     new e1f12c0  Add misc functions to ts_lua and update document to avoid using print
     new 11bf272  fix typo

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 doc/admin-guide/plugins/ts_lua.en.rst     | 216 +++++++++++++++++++++---------
 plugins/experimental/ts_lua/ts_lua_http.c |  43 ++++++
 plugins/experimental/ts_lua/ts_lua_misc.c | 160 +++++++++++++++++++++-
 3 files changed, 351 insertions(+), 68 deletions(-)

-- 
To stop receiving notification emails like this one, please contact
kichan@apache.org.

[trafficserver] 02/02: fix typo

Posted by ki...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

kichan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/trafficserver.git

commit 11bf272a5a1d747dcde253f052b83c41e2859964
Author: Kit Chan <ki...@apache.org>
AuthorDate: Sat May 5 15:40:33 2018 -0700

    fix typo
---
 doc/admin-guide/plugins/ts_lua.en.rst | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/doc/admin-guide/plugins/ts_lua.en.rst b/doc/admin-guide/plugins/ts_lua.en.rst
index d1e4ae4..04da301 100644
--- a/doc/admin-guide/plugins/ts_lua.en.rst
+++ b/doc/admin-guide/plugins/ts_lua.en.rst
@@ -235,7 +235,7 @@ Here is an example:
 
 Remap status constants
 ----------------------
-**context:** do_emap
+**context:** do_remap
 
 ::
 

-- 
To stop receiving notification emails like this one, please contact
kichan@apache.org.

[trafficserver] 01/02: Add misc functions to ts_lua and update document to avoid using print

Posted by ki...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

kichan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/trafficserver.git

commit e1f12c000ffd23389fe91ed511f8ed351e8dd238
Author: Kit Chan <ki...@apache.org>
AuthorDate: Sat May 5 15:34:14 2018 -0700

    Add misc functions to ts_lua and update document to avoid using print
---
 doc/admin-guide/plugins/ts_lua.en.rst     | 218 ++++++++++++++++++++----------
 plugins/experimental/ts_lua/ts_lua_http.c |  43 ++++++
 plugins/experimental/ts_lua/ts_lua_misc.c | 160 +++++++++++++++++++++-
 3 files changed, 352 insertions(+), 69 deletions(-)

diff --git a/doc/admin-guide/plugins/ts_lua.en.rst b/doc/admin-guide/plugins/ts_lua.en.rst
index 8ada7c8..d1e4ae4 100644
--- a/doc/admin-guide/plugins/ts_lua.en.rst
+++ b/doc/admin-guide/plugins/ts_lua.en.rst
@@ -53,7 +53,7 @@ Synopsis
     local HOSTNAME = ''
     function __init__(argtb)
         if (#argtb) < 1 then
-            print(argtb[0], 'hostname parameter required!!')
+            ts.debug(argtb[0] .. ' hostname parameter required!!')
             return -1
         end
         HOSTNAME = argtb[1]
@@ -212,9 +212,30 @@ Here is an example:
 
 `TOP <#ts-lua-plugin>`_
 
+TS Basic Internal Information
+-----------------------------
+**syntax:** *ts.get_install_dir()*
+**syntax:** *ts.get_runtime_dir()*
+**syntax:** *ts.get_config_dir()*
+**syntax:** *ts.get_plugin_dir()*
+**syntax:** *ts.get_traffic_server_version()*
+
+**context:** global 
+
+**description**: get basic internal information for the TS instance, such as install directory, runtime directory,
+config directory, plugin directory and version of ATS
+
+Here is an example:
+
+::
+
+       local config_dir = ts.get_config_dir()
+
+`TOP <#ts-lua-plugin>`_
+
 Remap status constants
 ----------------------
-**context:** do_remap
+**context:** do_emap
 
 ::
 
@@ -567,7 +588,7 @@ Here is an example:
 
     function do_remap()
         local uri = ts.client_request.get_uri()
-        print(uri)
+        ts.debug(uri)
     end
 
 Then ``GET /st?a=1`` will yield the output:
@@ -604,7 +625,7 @@ Here is an example:
 
     function do_remap()
         local query = ts.client_request.get_uri_args()
-        print(query)
+        ts.debug(query)
     end
 
 Then ``GET /st?a=1&b=2`` will yield the output:
@@ -643,7 +664,7 @@ Here is an example:
 
     function do_remap()
         local query = ts.client_request.get_uri_params()
-        print(query)
+        ts.debug(query)
     end
 
 Then ``GET /st;a=1`` will yield the output:
@@ -682,7 +703,7 @@ Here is an example:
 
     function do_remap()
         local url = ts.client_request.get_url()
-        print(url)
+        ts.debug(url)
     end
 
 Then ``GET /st?a=1&b=2 HTTP/1.1\r\nHost: a.tbcdn.cn\r\n...`` will yield the output:
@@ -709,7 +730,7 @@ Here is an example:
 
     function do_remap()
         local ua = ts.client_request.header['User-Agent']
-        print(ua)
+        ts.debug(ua)
         ts.client_request.header['Host'] = 'a.tbcdn.cn'
     end
 
@@ -735,7 +756,7 @@ Here is an example:
     function do_remap()
         hdrs = ts.client_request.get_headers()
         for k, v in pairs(hdrs) do
-            print(k..': '..v)
+            ts.debug(k..': '..v)
         end
     end
 
@@ -764,9 +785,9 @@ Here is an example:
 
     function do_remap()
         ip, port, family = ts.client_request.client_addr.get_addr()
-        print(ip)               -- 192.168.231.17
-        print(port)             -- 17786
-        print(family)           -- 2(AF_INET)
+        ts.debug(ip)               -- 192.168.231.17
+        ts.debug(port)             -- 17786
+        ts.debug(family)           -- 2(AF_INET)
         return 0
     end
 
@@ -788,7 +809,7 @@ Here is an example:
 
     function do_global_read_request()
         port = ts.client_request.client_addr.get_incoming_port()
-        print(port)             -- 80
+        ts.debug(port)             -- 80
     end
 
 `TOP <#ts-lua-plugin>`_
@@ -807,7 +828,7 @@ Here is an example:
 
     function do_remap()
         local url_host = ts.client_request.get_url_host()
-        print(url_host)
+        ts.debug(url_host)
     end
 
 Then ``GET /liuyurou.txt HTTP/1.1\r\nHost: 192.168.231.129:8080\r\n...`` will yield the output:
@@ -860,7 +881,7 @@ Here is an example:
 
     function do_remap()
         local url_port = ts.client_request.get_url_port()
-        print(url_port)
+        ts.debug(url_port)
     end
 
 Then Then ``GET /liuyurou.txt HTTP/1.1\r\nHost: 192.168.231.129:8080\r\n...`` will yield the output:
@@ -896,7 +917,7 @@ Here is an example:
 
     function do_remap()
         local url_scheme = ts.client_request.get_url_scheme()
-        print(url_scheme)
+        ts.debug(url_scheme)
     end
 
 Then ``GET /liuyurou.txt HTTP/1.1\r\nHost: 192.168.231.129:8080\r\n...`` will yield the output:
@@ -1112,9 +1133,9 @@ Here is an example:
     function cache_lookup()
         local cache_status = ts.http.get_cache_lookup_status()
         if cache_status == TS_LUA_CACHE_LOOKUP_HIT_FRESH then
-            print('hit')
+            ts.debug('hit')
         else
-            print('not hit')
+            ts.debug('not hit')
         end
     end
 
@@ -1141,9 +1162,9 @@ Here is an example:
     function cache_lookup()
         local cache_status = ts.http.get_cache_lookup_status()
         if cache_status == TS_LUA_CACHE_LOOKUP_HIT_FRESH then
-            print('hit')
+            ts.debug('hit')
         else
-            print('not hit')
+            ts.debug('not hit')
         end
         ts.http.set_cache_lookup_status(TS_LUA_CACHE_LOOKUP_MISS)
     end
@@ -1187,7 +1208,7 @@ Here is an example:
         local cache_status = ts.http.get_cache_lookup_status()
         if cache_status == TS_LUA_CACHE_LOOKUP_HIT_FRESH then
             code = ts.cached_response.get_status()
-            print(code)         -- 200
+            ts.debug(code)         -- 200
         end
     end
 
@@ -1229,7 +1250,7 @@ Here is an example:
         local status = ts.http.get_cache_lookup_status()
         if status == TS_LUA_CACHE_LOOKUP_HIT_FRESH then
             local ct = ts.cached_response.header['Content-Type']
-            print(ct)         -- text/plain
+            ts.debug(ct)         -- text/plain
         end
     end
 
@@ -1258,7 +1279,7 @@ Here is an example:
         if status == TS_LUA_CACHE_LOOKUP_HIT_FRESH then
             hdrs = ts.cached_response.get_headers()
             for k, v in pairs(hdrs) do
-                print(k..': '..v)
+                ts.debug(k..': '..v)
             end
         end
     end
@@ -1299,7 +1320,7 @@ Here is an example:
 
     function send_request()
         local uri = ts.server_request.get_uri()
-        print(uri)
+        ts.debug(uri)
     end
 
     function do_remap()
@@ -1341,7 +1362,7 @@ Here is an example:
 
     function send_request()
         local query = ts.server_request.get_uri_args()
-        print(query)
+        ts.debug(query)
     end
 
     function do_remap()
@@ -1385,7 +1406,7 @@ Here is an example:
 
     function send_request()
         local query = ts.server_request.get_uri_params()
-        print(query)
+        ts.debug(query)
     end
 
     function do_remap()
@@ -1433,7 +1454,7 @@ Here is an example:
 
     function send_request()
         local ua = ts.server_request.header['User-Agent']
-        print(ua)
+        ts.debug(ua)
         ts.server_request.header['Accept-Encoding'] = 'gzip'
     end
 
@@ -1464,7 +1485,7 @@ Here is an example:
     function send_request()
         hdrs = ts.cached_response.get_headers()
         for k, v in pairs(hdrs) do
-            print(k..': '..v)
+            ts.debug(k..': '..v)
         end
     end
 
@@ -1532,9 +1553,9 @@ Here is an example:
 
     function do_global_send_request()
         ip, port, family = ts.server_request.server_addr.get_addr()
-        print(ip)               -- 192.168.231.17
-        print(port)             -- 80
-        print(family)           -- 2(AF_INET)
+        ts.debug(ip)               -- 192.168.231.17
+        ts.debug(port)             -- 80
+        ts.debug(family)           -- 2(AF_INET)
     end
 
 `TOP <#ts-lua-plugin>`_
@@ -1555,9 +1576,9 @@ Here is an example:
 
     function do_global_send_request()
         ip, port, family = ts.server_request.server_addr.get_nexthop_addr()
-        print(ip)               -- 192.168.231.17
-        print(port)             -- 80
-        print(family)           -- 2(AF_INET)
+        ts.debug(ip)               -- 192.168.231.17
+        ts.debug(port)             -- 80
+        ts.debug(family)           -- 2(AF_INET)
     end
 
 `TOP <#ts-lua-plugin>`_
@@ -1578,7 +1599,7 @@ Here is an example:
 
     function do_global_send_request()
         ip = ts.server_request.server_addr.get_ip()
-        print(ip)               -- 192.168.231.17
+        ts.debug(ip)               -- 192.168.231.17
     end
 
 `TOP <#ts-lua-plugin>`_
@@ -1599,7 +1620,7 @@ Here is an example:
 
     function do_global_send_request()
         port = ts.server_request.server_addr.get_port()
-        print(port)             -- 80
+        ts.debug(port)             -- 80
     end
 
 `TOP <#ts-lua-plugin>`_
@@ -1620,7 +1641,7 @@ Here is an example:
 
     function do_global_send_request()
         port = ts.server_request.server_addr.get_outgoing_port()
-        print(port)             -- 50880
+        ts.debug(port)             -- 50880
     end
 
 `TOP <#ts-lua-plugin>`_
@@ -1659,7 +1680,7 @@ Here is an example:
 
     function send_request()
         local url_host = ts.server_request.get_url_host()
-        print(url_host)
+        ts.debug(url_host)
     end
 
     function do_remap()
@@ -1737,7 +1758,7 @@ Here is an example:
 
     function send_request()
         local url_scheme = ts.server_request.get_url_scheme()
-        print(url_host)
+        ts.debug(url_host)
     end
 
     function do_remap()
@@ -1776,7 +1797,7 @@ Here is an example:
 
     function read_response()
         local code = ts.server_response.get_status()
-        print(code)         -- 200
+        ts.debug(code)         -- 200
     end
 
     function do_remap()
@@ -1855,7 +1876,7 @@ Here is an example:
 
     function read_response()
         local ct = ts.server_response.header['Content-Type']
-        print(ct)
+        ts.debug(ct)
         ts.server_response.header['Cache-Control'] = 'max-age=14400'
     end
 
@@ -1886,7 +1907,7 @@ Here is an example:
     function read_response()
         hdrs = ts.server_response.get_headers()
         for k, v in pairs(hdrs) do
-            print(k..': '..v)
+            ts.debug(k..': '..v)
         end
     end
 
@@ -1927,7 +1948,7 @@ Here is an example:
 
     function send_response()
         local code = ts.client_response.get_status()
-        print(code)         -- 200
+        ts.debug(code)         -- 200
     end
 
     function do_remap()
@@ -2006,7 +2027,7 @@ Here is an example:
 
     function send_response()
         local ct = ts.client_response.header['Content-Type']
-        print(ct)
+        ts.debug(ct)
         ts.client_response.header['Cache-Control'] = 'max-age=3600'
     end
 
@@ -2037,7 +2058,7 @@ Here is an example:
     function send_response()
         hdrs = ts.client_response.get_headers()
         for k, v in pairs(hdrs) do
-            print(k..': '..v)
+            ts.debug(k..': '..v)
         end
     end
 
@@ -2432,6 +2453,27 @@ Here is an example
 
 `TOP <#ts-lua-plugin>`_
 
+Server state constants
+----------------------
+**context:** global
+
+::
+
+    TS_LUA_SRVSTATE_STATE_UNDEFINED (0)
+    TS_LUA_SRVSTATE_ACTIVE_TIMEOUT (1)
+    TS_LUA_SRVSTATE_BAD_INCOMING_RESPONSE (2)
+    TS_LUA_SRVSTATE_CONNECTION_ALIVE (3)
+    TS_LUA_SRVSTATE_CONNECTION_CLOSED (4)
+    TS_LUA_SRVSTATE_CONNECTION_ERROR (5)
+    TS_LUA_SRVSTATE_INACTIVE_TIMEOUT(6)
+    TS_LUA_SRVSTATE_OPEN_RAW_ERROR (7)
+    TS_LUA_SRVSTATE_PARSE_ERROR (8)
+    TS_LUA_SRVSTATE_TRANSACTION_COMPLETE (9)
+    TS_LUA_SRVSTATE_CONGEST_CONTROL_CONGESTED_ON_F (10)
+    TS_LUA_SRVSTATE_CONGEST_CONTROL_CONGESTED_ON_M (11)
+
+`TOP <#ts-lua-plugin>`_
+
 ts.http.get_remap_from_url
 --------------------------
 **syntax:** *ts.http.get_remap_from_url()*
@@ -2470,27 +2512,43 @@ Here is an example
 
 `TOP <#ts-lua-plugin>`_
 
-Server state constants
-----------------------
-**context:** global
+ts.http.get_client_fd
+---------------------
+**syntax:** *ts.http.get_client_fd()*
+
+**context:** after do_global_read_request
+
+**description:** This function can be used to get the client FD for the transaction.
+
+Here is an example
 
 ::
 
-    TS_LUA_SRVSTATE_STATE_UNDEFINED (0)
-    TS_LUA_SRVSTATE_ACTIVE_TIMEOUT (1)
-    TS_LUA_SRVSTATE_BAD_INCOMING_RESPONSE (2)
-    TS_LUA_SRVSTATE_CONNECTION_ALIVE (3)
-    TS_LUA_SRVSTATE_CONNECTION_CLOSED (4)
-    TS_LUA_SRVSTATE_CONNECTION_ERROR (5)
-    TS_LUA_SRVSTATE_INACTIVE_TIMEOUT(6)
-    TS_LUA_SRVSTATE_OPEN_RAW_ERROR (7)
-    TS_LUA_SRVSTATE_PARSE_ERROR (8)
-    TS_LUA_SRVSTATE_TRANSACTION_COMPLETE (9)
-    TS_LUA_SRVSTATE_CONGEST_CONTROL_CONGESTED_ON_F (10)
-    TS_LUA_SRVSTATE_CONGEST_CONTROL_CONGESTED_ON_M (11)
+    function do_global_read_request()
+        local fd = ts.http.get_client_fd()
+        ts.debug(fd)
+    end
 
 `TOP <#ts-lua-plugin>`_
 
+ts.http.get_server_fd
+---------------------
+**syntax:** *ts.http.get_server_fd()*
+
+**context:** after do_global_send_request
+
+**description:** This function can be used to get the server (origin) FD for the transaction.
+
+Here is an example
+
+::
+
+    function do_global_send_request()
+        local fd = ts.http.get_server_fd()
+        ts.debug(fd)
+    end
+
+`TOP <#ts-lua-plugin>`_
 
 ts.add_package_path
 -------------------
@@ -2509,7 +2567,7 @@ Here is an example:
     ts.add_package_path('/home/a/test/lua/pac/?.lua')
     local nt = require("nt")
     function do_remap()
-        print(nt.t9(7979))
+        ts.debug(nt.t9(7979))
         return 0
     end
 
@@ -2532,7 +2590,7 @@ Here is an example:
     ts.add_package_cpath('/home/a/test/c/module/?.so')
     local ma = require("ma")
     function do_remap()
-        print(ma.ft())
+        ts.debug(ma.ft())
         return 0
     end
 
@@ -2554,8 +2612,8 @@ Here is an example:
 
     function do_remap()
         uri = ts.client_request.get_uri()
-        print(uri)              -- /foo
-        print(ts.md5(uri))      -- 1effb2475fcfba4f9e8b8a1dbc8f3caf
+        ts.debug(uri)              -- /foo
+        ts.debug(ts.md5(uri))      -- 1effb2475fcfba4f9e8b8a1dbc8f3caf
     end
 
 
@@ -2595,8 +2653,8 @@ Here is an example:
 
     function do_remap()
         uri = ts.client_request.get_uri()
-        print(uri)              -- /foo
-        print(ts.sha1(uri))     -- 6dbd548cc03e44b8b44b6e68e56255ce4273ae49
+        ts.debug(uri)              -- /foo
+        ts.debug(ts.sha1(uri))     -- 6dbd548cc03e44b8b44b6e68e56255ce4273ae49
     end
 
 
@@ -2728,7 +2786,7 @@ Here is a basic example:
         local url = string.format('http://%s/foo.txt', ts.ctx['host'])
         local res = ts.fetch(url)
         if res.status == 200 then
-            print(res.body)
+            ts.debug(res.body)
         end
     end
 
@@ -2780,7 +2838,7 @@ Here is an example:
                 })
 
     for i = 1, #(vec) do
-        print(vec[i].status)
+        ts.debug(vec[i].status)
     end
 
 
@@ -2818,7 +2876,7 @@ Here is an example:
                       'Cache-Control: max-age=7200\r\n' ..
                       'Accept-Ranges: bytes\r\n\r\n' ..
                       nt
-        print(dstr)
+        ts.debug(dstr)
         ts.say(resp)
     end
 
@@ -3016,6 +3074,30 @@ Here is an example:
 
 `TOP <#ts-lua-plugin>`_
 
+ts.host_lookup
+--------------
+**syntax:** *ts.host_lookup(hostname)*
+
+**context:** *hook point functions added after do_remap*
+
+**description:** Look for ip address of the host name without blocking. Nil if address cannot be found.
+
+Behind the scene, this method makes use of the ATS event model.
+
+Here is an example:
+
+::
+
+    function send_response()
+        local result = ts.host_lookup("www.xyz.com") -- ip address of www.xyz.com
+    end
+
+    function do_remap()
+        ts.hook(TS_LUA_HOOK_SEND_RESPONSE_HDR, send_response)
+    end
+
+`TOP <#ts-lua-plugin>`_
+
 ts.schedule
 -----------
 **syntax:** *ts.schedule(THREAD_TYPE, sec, FUNCTION, param1?, param2?, ...)*
diff --git a/plugins/experimental/ts_lua/ts_lua_http.c b/plugins/experimental/ts_lua/ts_lua_http.c
index cf93f3f..daf6f53 100644
--- a/plugins/experimental/ts_lua/ts_lua_http.c
+++ b/plugins/experimental/ts_lua/ts_lua_http.c
@@ -96,6 +96,9 @@ static int ts_lua_http_get_server_state(lua_State *L);
 static int ts_lua_http_get_remap_from_url(lua_State *L);
 static int ts_lua_http_get_remap_to_url(lua_State *L);
 
+static int ts_lua_http_get_server_fd(lua_State *L);
+static int ts_lua_http_get_client_fd(lua_State *L);
+
 static void ts_lua_inject_server_state_variables(lua_State *L);
 
 static void ts_lua_inject_http_resp_transform_api(lua_State *L);
@@ -232,6 +235,12 @@ ts_lua_inject_http_misc_api(lua_State *L)
   lua_pushcfunction(L, ts_lua_http_get_remap_to_url);
   lua_setfield(L, -2, "get_remap_to_url");
 
+  lua_pushcfunction(L, ts_lua_http_get_server_fd);
+  lua_setfield(L, -2, "get_server_fd");
+
+  lua_pushcfunction(L, ts_lua_http_get_client_fd);
+  lua_setfield(L, -2, "get_client_fd");
+
   ts_lua_inject_server_state_variables(L);
 }
 
@@ -789,6 +798,40 @@ done:
 }
 
 static int
+ts_lua_http_get_server_fd(lua_State *L)
+{
+  int fd;
+  ts_lua_http_ctx *http_ctx;
+
+  GET_HTTP_CONTEXT(http_ctx, L);
+
+  if (TSHttpTxnServerFdGet(http_ctx->txnp, &fd) != TS_SUCCESS) {
+    lua_pushnil(L);
+  } else {
+    lua_pushnumber(L, fd);
+  }
+
+  return 1;
+}
+
+static int
+ts_lua_http_get_client_fd(lua_State *L)
+{
+  int fd;
+  ts_lua_http_ctx *http_ctx;
+
+  GET_HTTP_CONTEXT(http_ctx, L);
+
+  if (TSHttpTxnClientFdGet(http_ctx->txnp, &fd) != TS_SUCCESS) {
+    lua_pushnil(L);
+  } else {
+    lua_pushnumber(L, fd);
+  }
+
+  return 1;
+}
+
+static int
 ts_lua_http_resp_transform_get_upstream_bytes(lua_State *L)
 {
   ts_lua_http_transform_ctx *transform_ctx;
diff --git a/plugins/experimental/ts_lua/ts_lua_misc.c b/plugins/experimental/ts_lua/ts_lua_misc.c
index e7260f4..380ea92 100644
--- a/plugins/experimental/ts_lua/ts_lua_misc.c
+++ b/plugins/experimental/ts_lua/ts_lua_misc.c
@@ -16,6 +16,8 @@
   limitations under the License.
 */
 
+#include "ts/ink_platform.h"
+#include <netinet/in.h>
 #include "ts_lua_util.h"
 
 static int ts_lua_get_process_id(lua_State *L);
@@ -23,10 +25,18 @@ static int ts_lua_get_now_time(lua_State *L);
 static int ts_lua_debug(lua_State *L);
 static int ts_lua_error(lua_State *L);
 static int ts_lua_sleep(lua_State *L);
+static int ts_lua_host_lookup(lua_State *L);
 static int ts_lua_schedule(lua_State *L);
+static int ts_lua_get_install_dir(lua_State *L);
+static int ts_lua_get_config_dir(lua_State *L);
+static int ts_lua_get_runtime_dir(lua_State *L);
+static int ts_lua_get_plugin_dir(lua_State *L);
+static int ts_lua_get_traffic_server_version(lua_State *L);
 
 static int ts_lua_sleep_cleanup(ts_lua_async_item *ai);
 static int ts_lua_sleep_handler(TSCont contp, TSEvent event, void *edata);
+static int ts_lua_host_lookup_cleanup(ts_lua_async_item *ai);
+static int ts_lua_host_lookup_handler(TSCont contp, TSEvent event, void *edata);
 static int ts_lua_schedule_handler(TSCont contp, TSEvent event, void *edata);
 
 static void ts_lua_inject_misc_variables(lua_State *L);
@@ -62,6 +72,30 @@ ts_lua_inject_misc_api(lua_State *L)
   lua_pushcfunction(L, ts_lua_schedule);
   lua_setfield(L, -2, "schedule");
 
+  /* ts.host_lookup(...) */
+  lua_pushcfunction(L, ts_lua_host_lookup);
+  lua_setfield(L, -2, "host_lookup");
+
+  /* ts.get_install_dir(...) */
+  lua_pushcfunction(L, ts_lua_get_install_dir);
+  lua_setfield(L, -2, "get_install_dir");
+
+  /* ts.get_config_dir(...) */
+  lua_pushcfunction(L, ts_lua_get_config_dir);
+  lua_setfield(L, -2, "get_config_dir");
+
+  /* ts.get_runtime_dir(...) */
+  lua_pushcfunction(L, ts_lua_get_runtime_dir);
+  lua_setfield(L, -2, "get_runtime_dir");
+
+  /* ts.get_plugin_dir(...) */
+  lua_pushcfunction(L, ts_lua_get_plugin_dir);
+  lua_setfield(L, -2, "get_plugin_dir");
+
+  /* ts.get_traffic_server_version(...) */
+  lua_pushcfunction(L, ts_lua_get_traffic_server_version);
+  lua_setfield(L, -2, "get_traffic_server_version");
+
   ts_lua_inject_misc_variables(L);
 }
 
@@ -163,7 +197,7 @@ ts_lua_schedule(lua_State *L)
   n = lua_gettop(L);
 
   if (n < 3) {
-    TSError("[ts_lua] ts.http.schedule need at least three params");
+    TSError("[ts_lua] ts.schedule need at least three parameters");
     return 0;
   }
 
@@ -291,3 +325,127 @@ ts_lua_sleep_cleanup(ts_lua_async_item *ai)
 
   return 0;
 }
+
+static int
+ts_lua_host_lookup(lua_State *L)
+{
+  const char *host;
+  size_t host_len = 0;
+  TSAction action;
+  TSCont contp;
+  ts_lua_async_item *ai;
+  ts_lua_cont_info *ci;
+
+  ci = ts_lua_get_cont_info(L);
+  if (ci == NULL) {
+    return 0;
+  }
+
+  if (lua_gettop(L) != 1) {
+    TSError("[ts_lua] ts.host_lookup need at least one parameter");
+    return 0;
+  }
+
+  host = luaL_checklstring(L, 1, &host_len);
+
+  contp  = TSContCreate(ts_lua_host_lookup_handler, ci->mutex);
+  action = TSHostLookup(contp, host, host_len);
+
+  ai = ts_lua_async_create_item(contp, ts_lua_host_lookup_cleanup, (void *)action, ci);
+  TSContDataSet(contp, ai);
+
+  return lua_yield(L, 0);
+}
+
+static int
+ts_lua_host_lookup_handler(TSCont contp, TSEvent event, void *edata)
+{
+  ts_lua_async_item *ai;
+  ts_lua_cont_info *ci;
+  struct sockaddr const *addr;
+  char cip[128];
+  lua_State *L;
+  ts_lua_coroutine *crt;
+
+  ai  = TSContDataGet(contp);
+  ci  = ai->cinfo;
+  crt = &ci->routine;
+  L   = crt->lua;
+
+  ai->data = NULL;
+  ts_lua_host_lookup_cleanup(ai);
+
+  if (event != TS_EVENT_HOST_LOOKUP) {
+    TSError("[ts_lua] ts.host_lookup receives unknown event");
+    lua_pushnil(L);
+  } else if (!edata) {
+    lua_pushnil(L);
+  } else {
+    TSHostLookupResult result = (TSHostLookupResult)edata;
+    addr                      = TSHostLookupResultAddrGet(result);
+    if (addr->sa_family == AF_INET) {
+      inet_ntop(AF_INET, (const void *)&((struct sockaddr_in *)addr)->sin_addr, cip, sizeof(cip));
+    } else {
+      inet_ntop(AF_INET6, (const void *)&((struct sockaddr_in6 *)addr)->sin6_addr, cip, sizeof(cip));
+    }
+    lua_pushstring(L, cip);
+  }
+
+  TSContCall(ci->contp, TS_LUA_EVENT_COROUTINE_CONT, (void *)1);
+
+  return 0;
+}
+
+static int
+ts_lua_host_lookup_cleanup(ts_lua_async_item *ai)
+{
+  if (ai->data) {
+    TSActionCancel((TSAction)ai->data);
+    ai->data = NULL;
+  }
+
+  TSContDestroy(ai->contp);
+  ai->deleted = 1;
+
+  return 0;
+}
+
+static int
+ts_lua_get_install_dir(lua_State *L)
+{
+  const char *s = TSInstallDirGet();
+  lua_pushstring(L, s);
+  return 1;
+}
+
+static int
+ts_lua_get_config_dir(lua_State *L)
+{
+  const char *s = TSConfigDirGet();
+  lua_pushstring(L, s);
+  return 1;
+}
+
+static int
+ts_lua_get_runtime_dir(lua_State *L)
+{
+  const char *s = TSRuntimeDirGet();
+  lua_pushstring(L, s);
+  return 1;
+}
+
+static int
+ts_lua_get_plugin_dir(lua_State *L)
+{
+  const char *s = TSPluginDirGet();
+  lua_pushstring(L, s);
+  return 1;
+}
+
+static int
+ts_lua_get_traffic_server_version(lua_State *L)
+{
+  const char *s = TSTrafficServerVersionGet();
+  lua_pushstring(L, s);
+  return 1;
+}

-- 
To stop receiving notification emails like this one, please contact
kichan@apache.org.