Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions doc/developer-guide/api/functions/TSHttpHookAdd.en.rst
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,11 @@ transaction hooks::
TSHttpTxnHookAdd(txnp, TS_HTTP_READ_REQUEST_HDR_HOOK, contp);
TSHttpTxnReenable(txnp, TS_EVENT_HTTP_CONTINUE);
return 0;
case TS_EVENT_HTTP_READ_REQUEST_HDR:
txnp = (TSHttpTxn) edata;
// ...
TSHttpTxnReenable(txnp, TS_EVENT_HTTP_CONTINUE);
return 0;
default:
break;
}
Expand All @@ -128,6 +133,9 @@ transaction hooks::
TSHttpHookAdd(TS_HTTP_SSN_START_HOOK, contp);
}

For more example code using hooks, see the test_hooks plugin in tests/tools/plugins (used by the test_hooks.test.py
Gold test).

See Also
========

Expand Down
19 changes: 19 additions & 0 deletions tests/gold_tests/pluginTest/test_hooks/log.gold
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,22 @@ Session: event=TS_EVENT_HTTP_TXN_CLOSE
Transaction: event=TS_EVENT_HTTP_TXN_CLOSE
Global: event=TS_EVENT_HTTP_SSN_CLOSE
Session: event=TS_EVENT_HTTP_SSN_CLOSE
Global: event=TS_EVENT_VCONN_START
Global: ssl flag=1
Global: event=TS_EVENT_SSL_SERVERNAME
Global: ssl flag=1
Global: event=TS_EVENT_SSL_CERT
Global: ssl flag=1
Global: event=TS_EVENT_HTTP_SSN_START
Global: event=TS_EVENT_HTTP_TXN_START
Session: event=TS_EVENT_HTTP_TXN_START
Global: event=TS_EVENT_HTTP_READ_REQUEST_HDR
Session: event=TS_EVENT_HTTP_READ_REQUEST_HDR
Transaction: event=TS_EVENT_HTTP_READ_REQUEST_HDR
Global: event=TS_EVENT_HTTP_TXN_CLOSE
Session: event=TS_EVENT_HTTP_TXN_CLOSE
Transaction: event=TS_EVENT_HTTP_TXN_CLOSE
Global: event=TS_EVENT_HTTP_SSN_CLOSE
Session: event=TS_EVENT_HTTP_SSN_CLOSE
Global: event=TS_EVENT_VCONN_CLOSE
Global: ssl flag=1
4 changes: 0 additions & 4 deletions tests/gold_tests/pluginTest/test_hooks/one.in

This file was deleted.

4 changes: 4 additions & 0 deletions tests/gold_tests/pluginTest/test_hooks/spurious.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
Global: event=TS_EVENT_VCONN_START
Global: ssl flag=1
Global: event=TS_EVENT_VCONN_CLOSE
Global: ssl flag=1
15 changes: 15 additions & 0 deletions tests/gold_tests/pluginTest/test_hooks/ssl/server.key
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQDWMHOiUF+ORmZjAxI8MWE9dblb7gQSJ36WCXlPFiFx6ynF+S1E
kXAYpIip5X0pzDUaIbLukxJUAAnOtMEO0PCgxJQUrEtRWh8wiJdbdQJF0Zs/9R+u
SUgb61f+mdTQvhqefBGx+xrpfAcgtcWiZuSA9Q3fvpDj5WOWSPWXBUuxywIDAQAB
AoGBAJPxRX2gjFAGWmQbU/YVmXfNH6navh8X/nx9sLeqrpE0AFeJI/ZPiqDKzMal
B43eSfNxwVi+ZxN0L1ICUbL9KKZvHs/QBxWLA1fGVAXrz7sRplEVvakPpTfHoEnv
sKaMWVKaK/S5WGbDhElb6zb/Lwo19DsIAPjGYqFvzFJBmobJAkEA9iSeTGkR9X26
GywZoYrIMlRh34htOIRx1UUq88rFzdrCF21kQ4lhBIkX5OZMMy652i2gyak4OZTe
YewIv8jw9QJBAN7EQNHG8jPwXfVp91/fqxVQEfumuP2i6uiWWYQgZCmla2+0xcLZ
pMQ6sQEe10hhTrVnzHgAUVp50Ntn2jwBX78CQF09veGAI9d1Cxzj9cmmAvRd1r2Q
tp8kPOLnUsALXib+6WtqewLCdcf8DtsdClyRJMIraq85tRzK8fryKNZNzkkCQEgA
yS7FDj5JgCU15hZgFk1iPx3HCt44jZM2HaL+UUHAzRQjKxTLAl3G1rWVAWLMyQML
lORoveLvotl4HOruSsMCQQCAx9dV9JUSFoyc1CWILp/FgUH/se4cjQCThGO0DoQQ
vGTYmntY7j9WRJ9esQrjdD6Clw8zM/45GIBNwnXzqo7Z
-----END RSA PRIVATE KEY-----
32 changes: 32 additions & 0 deletions tests/gold_tests/pluginTest/test_hooks/ssl/server.pem
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQDWMHOiUF+ORmZjAxI8MWE9dblb7gQSJ36WCXlPFiFx6ynF+S1E
kXAYpIip5X0pzDUaIbLukxJUAAnOtMEO0PCgxJQUrEtRWh8wiJdbdQJF0Zs/9R+u
SUgb61f+mdTQvhqefBGx+xrpfAcgtcWiZuSA9Q3fvpDj5WOWSPWXBUuxywIDAQAB
AoGBAJPxRX2gjFAGWmQbU/YVmXfNH6navh8X/nx9sLeqrpE0AFeJI/ZPiqDKzMal
B43eSfNxwVi+ZxN0L1ICUbL9KKZvHs/QBxWLA1fGVAXrz7sRplEVvakPpTfHoEnv
sKaMWVKaK/S5WGbDhElb6zb/Lwo19DsIAPjGYqFvzFJBmobJAkEA9iSeTGkR9X26
GywZoYrIMlRh34htOIRx1UUq88rFzdrCF21kQ4lhBIkX5OZMMy652i2gyak4OZTe
YewIv8jw9QJBAN7EQNHG8jPwXfVp91/fqxVQEfumuP2i6uiWWYQgZCmla2+0xcLZ
pMQ6sQEe10hhTrVnzHgAUVp50Ntn2jwBX78CQF09veGAI9d1Cxzj9cmmAvRd1r2Q
tp8kPOLnUsALXib+6WtqewLCdcf8DtsdClyRJMIraq85tRzK8fryKNZNzkkCQEgA
yS7FDj5JgCU15hZgFk1iPx3HCt44jZM2HaL+UUHAzRQjKxTLAl3G1rWVAWLMyQML
lORoveLvotl4HOruSsMCQQCAx9dV9JUSFoyc1CWILp/FgUH/se4cjQCThGO0DoQQ
vGTYmntY7j9WRJ9esQrjdD6Clw8zM/45GIBNwnXzqo7Z
-----END RSA PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIICszCCAhwCCQD4jSkztmlO1TANBgkqhkiG9w0BAQsFADCBnTELMAkGA1UEBhMC
VVMxCzAJBgNVBAgTAklMMRIwEAYDVQQHEwlDaGFtcGFpZ24xDjAMBgNVBAoTBVlh
aG9vMQ0wCwYDVQQLEwRFZGdlMSgwJgYDVQQDEx9qdWljZXByb2R1Y2UuY29ycC5u
ZTEueWFob28uY29tMSQwIgYJKoZIhvcNAQkBFhVwZXJzaWEuYXppekB5YWhvby5j
b20wHhcNMTcwODI4MDM0NDQ1WhcNMjcwODI2MDM0NDQ1WjCBnTELMAkGA1UEBhMC
VVMxCzAJBgNVBAgTAklMMRIwEAYDVQQHEwlDaGFtcGFpZ24xDjAMBgNVBAoTBVlh
aG9vMQ0wCwYDVQQLEwRFZGdlMSgwJgYDVQQDEx9qdWljZXByb2R1Y2UuY29ycC5u
ZTEueWFob28uY29tMSQwIgYJKoZIhvcNAQkBFhVwZXJzaWEuYXppekB5YWhvby5j
b20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANYwc6JQX45GZmMDEjwxYT11
uVvuBBInfpYJeU8WIXHrKcX5LUSRcBikiKnlfSnMNRohsu6TElQACc60wQ7Q8KDE
lBSsS1FaHzCIl1t1AkXRmz/1H65JSBvrV/6Z1NC+Gp58EbH7Gul8ByC1xaJm5ID1
Dd++kOPlY5ZI9ZcFS7HLAgMBAAEwDQYJKoZIhvcNAQELBQADgYEATX7975NdhIbJ
glda+sXI9a86GgOpiuKO+vKubRJQZA+UlPf2vHEONjC2+7Y1aZvZYaKYL74vxGky
zkgp6ANSPl45lqD632x0e1Z7vzW5TkqK1JB2/xH2WgDcQZmP0FuQHzVNs4GjghDr
HCp1+sQDhfPB4aLmLFeyN0TkhdH1N3M=
-----END CERTIFICATE-----
65 changes: 44 additions & 21 deletions tests/gold_tests/pluginTest/test_hooks/test_hooks.test.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,12 @@
Test TS API Hooks.
'''

Test.SkipUnless(
Condition.HasATSFeature('TS_USE_TLS_ALPN'),
Condition.HasCurlFeature('http2'),
)
Test.ContinueOnFail = True

# test_hooks.so will output test logging to this file.
Test.Env["OUTPUT_FILE"] = Test.RunDirectory + "/log.txt"

Expand All @@ -28,41 +34,58 @@
response_header = {"headers": "HTTP/1.1 200 OK\r\nConnection: close\r\n\r\n", "timestamp": "1469733493.993", "body": "" }
server.addResponse("sessionlog.json", request_header, response_header)

ts = Test.MakeATSProcess("ts")
ts = Test.MakeATSProcess("ts", select_ports=False)

ts.addSSLfile("ssl/server.pem")
ts.addSSLfile("ssl/server.key")

ts.Variables.ssl_port = 4443

ts.Disk.records_config.update({
'proxy.config.http.cache.http': 0, # Make sure each request is forwarded to the origin server.
'proxy.config.proxy_name': 'Poxy_Proxy', # This will be the server name.
'proxy.config.ssl.server.cert.path': '{0}'.format(ts.Variables.SSLDir),
'proxy.config.ssl.server.private_key.path': '{0}'.format(ts.Variables.SSLDir),
'proxy.config.http.server_ports': (
'ipv4:{0} ipv4:{1}:proto=http2;http:ssl'.format(ts.Variables.port, ts.Variables.ssl_port)),
'proxy.config.url_remap.remap_required': 0,
'proxy.config.diags.debug.enabled': 1,
'proxy.config.diags.debug.tags': 'test_hooks'
# 'proxy.config.diags.debug.tags': 'http|test_hooks'
'proxy.config.diags.debug.enabled': 0,
'proxy.config.diags.debug.tags': 'http|test_hooks',
})

ts.Disk.remap_config.AddLine(
"map http://one http://127.0.0.1:{0}".format(server.Variables.Port)
ts.Disk.ssl_multicert_config.AddLine(
'dest_ip=* ssl_cert_name=server.pem ssl_key_name=server.key'
)

Test.PreparePlugin(Test.Variables.AtsTestToolsDir + '/plugins/test_hooks.cc', ts)

ts.Disk.remap_config.AddLine(
"map http://one http://127.0.0.1:{0}".format(server.Variables.Port)
)
ts.Disk.remap_config.AddLine(
"map https://one http://127.0.0.1:{0}".format(server.Variables.Port)
)

tr = Test.AddTestRun()
tr.Processes.Default.StartBefore(Test.Processes.ts)
tr.Processes.Default.StartBefore(Test.Processes.server)
tr.Processes.Default.Command = "cp {}/tcp_client.py {}/tcp_client.py".format(
Test.Variables.AtsTestToolsDir, Test.RunDirectory)
# Wait for the micro server
tr.Processes.Default.StartBefore(server, ready=When.PortOpen(server.Variables.Port))
# Delay on readiness of our ssl ports
tr.Processes.Default.StartBefore(Test.Processes.ts, ready=When.PortOpen(ts.Variables.port))
#
tr.Processes.Default.Command = (
'curl --verbose --ipv4 --header "Host: one" http://localhost:{0}/argh'.format(ts.Variables.port)
)
tr.Processes.Default.ReturnCode = 0

def sendMsg(msgFile):

tr = Test.AddTestRun()
tr.Processes.Default.Command = (
"python {}/tcp_client.py 127.0.0.1 {} {}/{}.in".format(
Test.RunDirectory, ts.Variables.port, Test.TestDirectory, msgFile)
)
tr.Processes.Default.ReturnCode = 0

sendMsg('one')
tr = Test.AddTestRun()
# A small delay so the test_hooks test plugin can assume there is only one HTTP transaction in progress at a time.
tr.Processes.Default.Command = (
'curl --verbose --ipv4 --http2 --insecure --header "Host: one" https://localhost:{0}/argh'.format(ts.Variables.ssl_port)
)
tr.Processes.Default.ReturnCode = 0

tr = Test.AddTestRun()
tr.Processes.Default.Command = "echo test log.gold"
tr.Processes.Default.Command = "echo check log"
tr.Processes.Default.ReturnCode = 0
f = tr.Disk.File("log.txt")
f.Content = "log.gold"
53 changes: 53 additions & 0 deletions tests/tools/plugins/test_hooks.cc
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,8 @@ char PIName[] = PINAME;
//
std::fstream logFile;

TSVConn activeVConn;

TSHttpSsn activeSsn;

TSHttpTxn activeTxn;
Expand Down Expand Up @@ -167,6 +169,41 @@ globalContFunc(TSCont, TSEvent event, void *eventData)
TSDebug(PIName, "Global: event=%s(%d) eventData=%p", TSHttpEventNameLookup(event), event, eventData);

switch (event) {
case TS_EVENT_VCONN_START: {
ALWAYS_ASSERT(!activeVConn)

auto vConn = static_cast<TSVConn>(eventData);

activeVConn = vConn;

logFile << "Global: ssl flag=" << TSVConnIsSsl(vConn) << std::endl;

TSVConnReenable(vConn);
} break;

case TS_EVENT_SSL_CERT:
case TS_EVENT_SSL_SERVERNAME: {
auto vConn = static_cast<TSVConn>(eventData);

ALWAYS_ASSERT(vConn == activeVConn)

logFile << "Global: ssl flag=" << TSVConnIsSsl(vConn) << std::endl;

TSVConnReenable(vConn);
} break;

case TS_EVENT_VCONN_CLOSE: {
auto vConn = static_cast<TSVConn>(eventData);

ALWAYS_ASSERT(vConn == activeVConn)

logFile << "Global: ssl flag=" << TSVConnIsSsl(vConn) << std::endl;

TSVConnReenable(vConn);

activeVConn = nullptr;
} break;

case TS_EVENT_HTTP_SSN_START: {
ALWAYS_ASSERT(!activeSsn)

Expand Down Expand Up @@ -288,6 +325,22 @@ TSPluginInit(int argc, const char *argv[])
TSHttpHookAdd(TS_HTTP_SSN_CLOSE_HOOK, gCont);
TSHttpHookAdd(TS_HTTP_TXN_START_HOOK, gCont);
TSHttpHookAdd(TS_HTTP_TXN_CLOSE_HOOK, gCont);
TSHttpHookAdd(TS_SSL_CERT_HOOK, gCont);
TSHttpHookAdd(TS_SSL_SERVERNAME_HOOK, gCont);

// NOTE: as of January 2019 these two hooks are only triggered for TLS connections. It seems that, at trafficserver
// startup, spurious data on the TLS TCP port may cause trafficserver to attempt (and fail) to create a TLS
// connection. If this happens, it will result in TS_VCONN_START_HOOK being triggered, and then TS_VCONN_CLOSE_HOOK
// will be triggered when the connection closes due to failure.
//
TSHttpHookAdd(TS_VCONN_START_HOOK, gCont);
TSHttpHookAdd(TS_VCONN_CLOSE_HOOK, gCont);

// TSHttpHookAdd(TS_SSL_SESSION_HOOK, gCont); -- Event is TS_EVENT_SSL_SESSION_NEW -- Event data is TSHttpSsn
// TSHttpHookAdd(TS_SSL_SERVER_VERIFY_HOOK, gCont);
// TSHttpHookAdd(TS_SSL_VERIFY_CLIENT_HOOK, gCont);
// TSHttpHookAdd(TS_VCONN_OUTBOUND_START_HOOK, gCont);
// TSHttpHookAdd(TS_VCONN_OUTBOUND_CLOSE_HOOK, gCont);

sCont = TSContCreate(sessionContFunc, mtx);

Expand Down