TSHttpHookAdd

Intercept Traffic Server events.

概要

#include <ts/ts.h>

void TSHttpHookAdd(TSHttpHookID id, TSCont contp)
void TSHttpSsnHookAdd(TSHttpSsn ssnp, TSHttpHookID id, TSCont contp)
void TSHttpTxnHookAdd(TSHttpTxn txnp, TSHttpHookID id, TSCont contp)

解説

フックは Apache Traffic Server の HTTP 処理の中でプラグインが入り込み何かできる場所です。コールバックのためのプラグインの関数を登録することはフックに関数を追加することと同じです。一つずつすべてのトランザクション、もしくは特定のトランザクションのみにコールバックされるプラグインを登録することができます。

HTTP transaction フックは関数 TSHttpHookAdd() を使いグローバルにセットされます。これは TSHttpHookAdd() のパラメーターとして指定された継続は全トランザクションで呼ばれるということを意味します。TSHttpHookAdd() は一般的に TSPluginInit() もしくは TSRemapInit() から呼ばれます。

TSHttpSsnHookAdd()contpid で指定された HTTP session フックのリストの最後に追加します。これは contp がフック ID で指定された場所において、セッション中のすべてのトランザクションで呼び出されることを意味します。contp がセッションに追加されるので、プラグインの初期化ルーチンから TSHttpSsnHookAdd() を呼び出すことはできません。プラグインは HTTP セッションを取り扱う必要があります。

TSHttpTxnHookAdd()contpid で指定された HTTP トランザクションフックのリストの最後に追加します。contp がトランザクションに追加されるので、プラグインの初期化ルーチンから TSHttpTxnHookAdd() を呼び出すことはできず、プラグインが HTTP トランザクションを取り扱うときのみ呼び出せます。

Return Values

無し。フックの追加は常に成功します。

次の例はどのようにグローバル、セッション、トランザクションフックを追加するかを紹介しています。

#include <ts/ts.h>

static int
handler(TSCont contp, TSEvent event, void *edata)
{
    TSHttpSsn ssnp;
    TSHttpTxn txnp;

    switch (event){
    case TS_EVENT_HTTP_SSN_START:
        ssnp = (TSHttpSsn) edata;
        // Add a session hook ...
        TSHttpSsnHookAdd(ssnp, TS_HTTP_TXN_START_HOOK, contp);
        TSHttpSsnReenable(ssnp, TS_EVENT_HTTP_CONTINUE);
        return 0;
    case TS_EVENT_HTTP_TXN_START:
        txnp = (TSHttpTxn) edata;
        // Add a transaction hook ...
        TSHttpTxnHookAdd(txnp, TS_HTTP_READ_REQUEST_HDR_HOOK, contp);
        TSHttpTxnReenable(txnp, TS_EVENT_HTTP_CONTINUE);
        return 0;
    default:
         break;
    }

    return 0;
}

void
TSPluginInit (int argc, const char *argv[])
{
    TSCont contp;
    contp = TSContCreate(handler, NULL);
    TSHttpHookAdd(TS_HTTP_SSN_START_HOOK, contp);
}

参照

TSAPI(3ts), TSContCreate(3ts), TSLifecycleHookAdd(3ts)