Accessing the Transaction Being Processed

A continuation’s handler function is of type TSEventFunc; the prototype is as follows:

static int function_name (TSCont contp, TSEvent event, void *edata)

In general, the return value of the handler function is not used. The continuation argument is the continuation being called back, the event is the event being sent to the continuation, and the data pointed to by void *edata depends on the type of event. The data types for each event type are listed in Writing Handler Functions

The key here is that if the event is an HTTP transaction event, then the data passed to the continuation’s handler is of type TSHttpTxn (a data type that represents HTTP transactions). Your plugin can then do things with the transaction. Here’s how it looks in the code for the Denylist plugin’s handler:

static int
denylist_plugin (TSCont contp, TSEvent event, void *edata)
{
   TSHttpTxn txnp = static_cast<TSHttpTxn>(edata);
   switch (event) {
      case TS_EVENT_HTTP_OS_DNS:
         handle_dns (txnp, contp);
         return 0;
      case TS_EVENT_HTTP_SEND_RESPONSE_HDR:
         handle_response (txnp);
         return 0;
      default:
         break;
   }
   return 0;
}

For example: when the origin server DNS lookup event is sent, denylist_plugin can call handle_dnsand pass txnp as an argument.