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

zwoop pushed a commit to branch 9.0.x
in repository https://gitbox.apache.org/repos/asf/trafficserver.git


The following commit(s) were added to refs/heads/9.0.x by this push:
     new 9769e17  Expose client SSL stats via API & Lua
9769e17 is described below

commit 9769e17f2c7f6c69df49e74a9e5bff468d6d4eec
Author: Valentin Gutierrez <[email protected]>
AuthorDate: Tue Jul 16 12:06:50 2019 +0700

    Expose client SSL stats via API & Lua
    
    (cherry picked from commit cd92e255380b319e3c3473f14a2209c5487cdbce)
---
 doc/admin-guide/plugins/lua.en.rst  |  80 ++++++++++++++++++++++
 include/ts/ts.h                     |  31 +++++++++
 plugins/lua/ts_lua_client_request.c | 128 ++++++++++++++++++++++++++++++++++++
 src/traffic_server/InkAPI.cc        |  36 ++++++++++
 4 files changed, 275 insertions(+)

diff --git a/doc/admin-guide/plugins/lua.en.rst 
b/doc/admin-guide/plugins/lua.en.rst
index 465ee4c..5686b28 100644
--- a/doc/admin-guide/plugins/lua.en.rst
+++ b/doc/admin-guide/plugins/lua.en.rst
@@ -959,6 +959,86 @@ server request, and we should return 
TS_LUA_REMAP_DID_REMAP(_STOP) in do_remap.
 
 :ref:`TOP <admin-plugins-ts-lua>`
 
+ts.client_request.get_ssl_reused
+-----------------------------------------------
+**syntax:** *ts.client_request.get_ssl_reused()*
+
+**context:** do_remap/do_os_response or do_global_* or later
+
+**description**: This function can be used to know if the SSL session has been 
reused (1) or not (0)
+
+Here is an example:
+
+::
+
+    function do_global_read_request()
+        ssl_reused = ts.client_request.get_ssl_reused()
+        ts.debug(ssl_reused)             -- 0
+    end
+
+
+`TOP <#lua-plugin>`_
+
+ts.client_request.get_ssl_protocol
+-----------------------------------------------
+**syntax:** *ts.client_request.get_ssl_protocol()*
+
+**context:** do_remap/do_os_response or do_global_* or later
+
+**description**: This function can be used to get the SSL protocol used to 
communicate with the client
+
+Here is an example:
+
+::
+
+    function do_global_read_request()
+        ssl_protocol = ts.client_request.get_ssl_protocol()
+        ts.debug(ssl_protocol)             -- TLSv1.2
+    end
+
+
+`TOP <#lua-plugin>`_
+
+ts.client_request.get_ssl_cipher
+-----------------------------------------------
+**syntax:** *ts.client_request.get_ssl_cipher()*
+
+**context:** do_remap/do_os_response or do_global_* or later
+
+**description**: This function can be used to get the SSL cipher used to 
communicate with the client
+
+Here is an example:
+
+::
+
+    function do_global_read_request()
+        ssl_cipher = ts.client_request.get_ssl_cipher()
+        ts.debug(ssl_cipher)             -- ECDHE-ECDSA-AES256-GCM-SHA384
+    end
+
+
+`TOP <#lua-plugin>`_
+
+ts.client_request.get_ssl_curve
+-----------------------------------------------
+**syntax:** *ts.client_request.get_ssl_curve()*
+
+**context:** do_remap/do_os_response or do_global_* or later
+
+**description**: This function can be used to get the SSL Elliptic curve used 
to communicate with the client
+
+Here is an example:
+
+::
+
+    function do_global_read_request()
+        ssl_curve = ts.client_request.get_ssl_curve()
+        ts.debug(ssl_curve)             -- X25519
+    end
+
+
+`TOP <#lua-plugin>`_
+
 ts.http.set_cache_url
 ---------------------
 **syntax:** *ts.http.set_cache_url(KEY_URL)*
diff --git a/include/ts/ts.h b/include/ts/ts.h
index 71a663e..a59897d 100644
--- a/include/ts/ts.h
+++ b/include/ts/ts.h
@@ -2296,6 +2296,37 @@ tsapi int TSHttpTxnServerRespHdrBytesGet(TSHttpTxn txnp);
 tsapi int64_t TSHttpTxnServerRespBodyBytesGet(TSHttpTxn txnp);
 tsapi int TSHttpTxnClientRespHdrBytesGet(TSHttpTxn txnp);
 tsapi int64_t TSHttpTxnClientRespBodyBytesGet(TSHttpTxn txnp);
+tsapi int TSVConnIsSslReused(TSVConn sslp);
+
+/**
+   Return the current (if set) SSL Cipher. This is still owned by the
+   core, and must not be free'd.
+
+   @param sslp The connection pointer
+
+   @return the SSL Cipher
+*/
+tsapi const char *TSVConnSslCipherGet(TSVConn sslp);
+
+/**
+   Return the current (if set) SSL Protocol. This is still owned by the
+   core, and must not be free'd.
+
+   @param sslp The connection pointer
+
+   @return the SSL Protocol
+*/
+tsapi const char *TSVConnSslProtocolGet(TSVConn sslp);
+
+/**
+   Return the current (if set) SSL Curve. This is still owned by the
+   core, and must not be free'd.
+
+   @param txnp the transaction pointer
+
+   @return the SSL Curve
+*/
+tsapi const char *TSVConnSslCurveGet(TSVConn sslp);
 
 /* NetVC timeout APIs. */
 tsapi void TSVConnInactivityTimeoutSet(TSVConn connp, TSHRTime timeout);
diff --git a/plugins/lua/ts_lua_client_request.c 
b/plugins/lua/ts_lua_client_request.c
index b851eb1..e5c8c62 100644
--- a/plugins/lua/ts_lua_client_request.c
+++ b/plugins/lua/ts_lua_client_request.c
@@ -66,6 +66,15 @@ static int 
ts_lua_client_request_client_addr_get_port(lua_State *L);
 static int ts_lua_client_request_client_addr_get_addr(lua_State *L);
 static int ts_lua_client_request_client_addr_get_incoming_port(lua_State *L);
 
+static void ts_lua_inject_client_request_ssl_reused_api(lua_State *L);
+static int ts_lua_client_request_get_ssl_reused(lua_State *L);
+static void ts_lua_inject_client_request_ssl_cipher_api(lua_State *L);
+static int ts_lua_client_request_get_ssl_cipher(lua_State *L);
+static void ts_lua_inject_client_request_ssl_protocol_api(lua_State *L);
+static int ts_lua_client_request_get_ssl_protocol(lua_State *L);
+static void ts_lua_inject_client_request_ssl_curve_api(lua_State *L);
+static int ts_lua_client_request_get_ssl_curve(lua_State *L);
+
 void
 ts_lua_inject_client_request_api(lua_State *L)
 {
@@ -82,6 +91,10 @@ ts_lua_inject_client_request_api(lua_State *L)
   ts_lua_inject_client_request_version_api(L);
   ts_lua_inject_client_request_body_size_api(L);
   ts_lua_inject_client_request_header_size_api(L);
+  ts_lua_inject_client_request_ssl_reused_api(L);
+  ts_lua_inject_client_request_ssl_cipher_api(L);
+  ts_lua_inject_client_request_ssl_protocol_api(L);
+  ts_lua_inject_client_request_ssl_curve_api(L);
 
   lua_setfield(L, -2, "client_request");
 }
@@ -924,3 +937,118 @@ ts_lua_client_request_get_header_size(lua_State *L)
 
   return 1;
 }
+
+static void
+ts_lua_inject_client_request_ssl_reused_api(lua_State *L)
+{
+  lua_pushcfunction(L, ts_lua_client_request_get_ssl_reused);
+  lua_setfield(L, -2, "get_ssl_reused");
+}
+
+static int
+ts_lua_client_request_get_ssl_reused(lua_State *L)
+{
+  int ssl_reused = 0;
+  ts_lua_http_ctx *http_ctx;
+  TSHttpSsn ssnp;
+  TSVConn client_conn;
+
+  GET_HTTP_CONTEXT(http_ctx, L);
+  ssnp        = TSHttpTxnSsnGet(http_ctx->txnp);
+  client_conn = TSHttpSsnClientVConnGet(ssnp);
+
+  if (TSVConnIsSsl(client_conn)) {
+    ssl_reused = TSVConnIsSslReused(client_conn);
+  }
+
+  lua_pushnumber(L, ssl_reused);
+
+  return 1;
+}
+
+static void
+ts_lua_inject_client_request_ssl_cipher_api(lua_State *L)
+{
+  lua_pushcfunction(L, ts_lua_client_request_get_ssl_cipher);
+  lua_setfield(L, -2, "get_ssl_cipher");
+}
+
+static int
+ts_lua_client_request_get_ssl_cipher(lua_State *L)
+{
+  const char *ssl_cipher = "-";
+  ts_lua_http_ctx *http_ctx;
+  TSHttpSsn ssnp;
+  TSVConn client_conn;
+
+  GET_HTTP_CONTEXT(http_ctx, L);
+
+  ssnp        = TSHttpTxnSsnGet(http_ctx->txnp);
+  client_conn = TSHttpSsnClientVConnGet(ssnp);
+
+  if (TSVConnIsSsl(client_conn)) {
+    ssl_cipher = TSVConnSslCipherGet(client_conn);
+  }
+
+  lua_pushstring(L, ssl_cipher);
+
+  return 1;
+}
+
+static void
+ts_lua_inject_client_request_ssl_protocol_api(lua_State *L)
+{
+  lua_pushcfunction(L, ts_lua_client_request_get_ssl_protocol);
+  lua_setfield(L, -2, "get_ssl_protocol");
+}
+
+static int
+ts_lua_client_request_get_ssl_protocol(lua_State *L)
+{
+  const char *ssl_protocol = "-";
+  ts_lua_http_ctx *http_ctx;
+  TSHttpSsn ssnp;
+  TSVConn client_conn;
+
+  GET_HTTP_CONTEXT(http_ctx, L);
+
+  ssnp        = TSHttpTxnSsnGet(http_ctx->txnp);
+  client_conn = TSHttpSsnClientVConnGet(ssnp);
+
+  if (TSVConnIsSsl(client_conn)) {
+    ssl_protocol = TSVConnSslProtocolGet(client_conn);
+  }
+
+  lua_pushstring(L, ssl_protocol);
+
+  return 1;
+}
+
+static void
+ts_lua_inject_client_request_ssl_curve_api(lua_State *L)
+{
+  lua_pushcfunction(L, ts_lua_client_request_get_ssl_curve);
+  lua_setfield(L, -2, "get_ssl_curve");
+}
+
+static int
+ts_lua_client_request_get_ssl_curve(lua_State *L)
+{
+  const char *ssl_curve = "-";
+  ts_lua_http_ctx *http_ctx;
+  TSHttpSsn ssnp;
+  TSVConn client_conn;
+
+  GET_HTTP_CONTEXT(http_ctx, L);
+
+  ssnp        = TSHttpTxnSsnGet(http_ctx->txnp);
+  client_conn = TSHttpSsnClientVConnGet(ssnp);
+
+  if (TSVConnIsSsl(client_conn)) {
+    ssl_curve = TSVConnSslCurveGet(client_conn);
+  }
+
+  lua_pushstring(L, ssl_curve);
+
+  return 1;
+}
diff --git a/src/traffic_server/InkAPI.cc b/src/traffic_server/InkAPI.cc
index 7fa63d0..cd4059e 100644
--- a/src/traffic_server/InkAPI.cc
+++ b/src/traffic_server/InkAPI.cc
@@ -6488,6 +6488,42 @@ TSHttpTxnClientRespBodyBytesGet(TSHttpTxn txnp)
 }
 
 int
+TSVConnIsSslReused(TSVConn sslp)
+{
+  NetVConnection *vc        = reinterpret_cast<NetVConnection *>(sslp);
+  SSLNetVConnection *ssl_vc = dynamic_cast<SSLNetVConnection *>(vc);
+
+  return ssl_vc ? ssl_vc->getSSLSessionCacheHit() : 0;
+}
+
+const char *
+TSVConnSslCipherGet(TSVConn sslp)
+{
+  NetVConnection *vc        = reinterpret_cast<NetVConnection *>(sslp);
+  SSLNetVConnection *ssl_vc = dynamic_cast<SSLNetVConnection *>(vc);
+
+  return ssl_vc ? ssl_vc->getSSLCipherSuite() : nullptr;
+}
+
+const char *
+TSVConnSslProtocolGet(TSVConn sslp)
+{
+  NetVConnection *vc        = reinterpret_cast<NetVConnection *>(sslp);
+  SSLNetVConnection *ssl_vc = dynamic_cast<SSLNetVConnection *>(vc);
+
+  return ssl_vc ? ssl_vc->getSSLProtocol() : nullptr;
+}
+
+const char *
+TSVConnSslCurveGet(TSVConn sslp)
+{
+  NetVConnection *vc        = reinterpret_cast<NetVConnection *>(sslp);
+  SSLNetVConnection *ssl_vc = dynamic_cast<SSLNetVConnection *>(vc);
+
+  return ssl_vc ? ssl_vc->getSSLCurve() : nullptr;
+}
+
+int
 TSHttpTxnPushedRespHdrBytesGet(TSHttpTxn txnp)
 {
   sdk_assert(sdk_sanity_check_txn(txnp) == TS_SUCCESS);

Reply via email to