ハンドラー関数の記述

ハンドラー関数は継続の重要なコンポーネントです。これはイベントとイベントデータを検査し、その後適切な処理を行う事になっています。行われるであろうアクションは、別のイベントを継続が受け取るようスケジュールする、サーバへのコネクションを開始する、単純に自身を破棄するなどになる可能性があります。

継続のハンドラー関数は TSEventFunc 型の関数です。引数は継続、イベント、そして幾つかのデータ(このデータは呼び出し元によって継続に渡されます。このデータを TSContDataSet() によって関連付けられる継続自身のデータと混同しないでください。)へのポインタです。継続がコールバックされる際、継続とイベントはハンドラー関数に渡されます。継続は発生した同じ継続へのハンドルです。ハンドラー関数は典型的に受け取ったイベントを処理するための switch 文を持ちます。 :

static int some_handler (TScont contp, TSEvent event, void *edata)
{
   // .....
   switch(event) {
      case TS_EVENT_SOME_EVENT_1:
         do_some_thing_1;
         return;
      case TS_EVENT_SOME_EVENT_2:
         do_some_thing_2;
         return;
      case TS_EVENT_SOME_EVENT_3:
         do_some_thing_3;
         return;
      default: break;
   }
   return 0;
}

注意

継続は更なるイベントが向かってきている "途中" かどうか確認できないことに気付くかもしれません。 TSHttpTxnHookAdd() の呼び出しによって送られるような、全てのやって来るイベントが処理されたのを確認する前に、継続を削除するための TSContDestroy() を使用しないでください。

注意

TS_HTTP_SEND_REQUEST_HDR_HOOK may callback several times when the OS crashed. Be careful to use functions such as TSContDestroy in TS_HTTP_SEND_REQUEST_HDR_HOOK hook.

下記の表ではハンドラー関数に渡されるイベントと void* data の型に相当するものを列挙します。 :

イベント

イベントの送信元

データタイプ

TS_EVENT_HTTP_READ_REQUEST_HDR

TS_HTTP_READ_REQUEST_HDR_HOOK

TSHttpTxn

TS_EVENT_HTTP_PRE_REMAP

TS_HTTP_PRE_REMAP_HOOK

TSHttpTxn

TS_EVENT_HTTP_OS_DNS

TS_HTTP_OS_DNS_HOOK

TSHttpTxn

TS_EVENT_HTTP_SEND_REQUEST_HDR

TS_HTTP_SEND_REQUEST_HDR_HOOK

TSHttpTxn

TS_EVENT_HTTP_READ_CACHE_HDR

TS_HTTP_READ_CACHE_HDR_HOOK

TSHttpTxn

TS_EVENT_HTTP_READ_RESPONSE_HDR

TS_HTTP_READ_RESPONSE_HDR_HOOK

TSHttpTxn

TS_EVENT_HTTP_SEND_RESPONSE_HDR

TS_HTTP_SEND_RESPONSE_HDR_HOOK

TSHttpTxn

TS_EVENT_HTTP_SELECT_ALT

TS_HTTP_SELECT_ALT_HOOK

TSHttpTxn

TS_EVENT_HTTP_TXN_START

TS_HTTP_TXN_START_HOOK

TSHttpTxn

TS_EVENT_HTTP_TXN_CLOSE

TS_HTTP_TXN_CLOSE_HOOK

TSHttpTxn

TS_EVENT_HTTP_SSN_START

TS_HTTP_SSN_START_HOOK

TSHttpSsn

TS_EVENT_HTTP_SSN_CLOSE

TS_HTTP_SSN_CLOSE_HOOK

TSHttpSsn

TS_EVENT_NONE

TS_EVENT_CACHE_LOOKUP_COMPLETE

TS_HTTP_CACHE_LOOKUP_COMPLETE_HOOK

TSHttpTxn

TS_EVENT_IMMEDIATE

TSVConnClose()

TSVIOReenable() TSContScheduleOnPool() TSContScheduleOnThread()

TS_EVENT_IMMEDIATE

TS_HTTP_REQUEST_TRANSFORM_HOOK

TS_EVENT_IMMEDIATE

TS_HTTP_RESPONSE_TRANSFORM_HOOK

TS_EVENT_CACHE_OPEN_READ

TSCacheRead()

キャッシュ VC

TS_EVENT_CACHE_OPEN_READ_FAILED

TSCacheRead()

TS_CACHE_ERROR コード

TS_EVENT_CACHE_OPEN_WRITE

TSCacheWrite()

キャッシュ VC

TS_EVENT_CACHE_OPEN_WRITE_FAILED

TSCacheWrite()

TS_CACHE_ERROR コード

TS_EVENT_CACHE_REMOVE

TSCacheRemove()

TS_EVENT_CACHE_REMOVE_FAILED

TSCacheRemove()

TS_CACHE_ERROR コード

TS_EVENT_NET_ACCEPT

TSNetAccept()

TSHttpTxnServerIntercept() TSHttpTxnIntercept()

TSNetVConnection

TS_EVENT_NET_ACCEPT_FAILED

TSNetAccept()

TSHttpTxnServerIntercept() TSHttpTxnIntercept()

TS_EVENT_HOST_LOOKUP

TSHostLookup()

TSHostLookupResult

TS_EVENT_TIMEOUT

TSContScheduleOnPool()

TSContScheduleOnThread()

TS_EVENT_ERROR

TS_EVENT_VCONN_READ_READY

TSVConnRead()

TSVIO

TS_EVENT_VCONN_WRITE_READY

TSVConnWrite()

TSVIO

TS_EVENT_VCONN_READ_COMPLETE

TSVConnRead()

TSVIO

TS_EVENT_VCONN_WRITE_COMPLETE

TSVConnWrite()

TSVIO

TS_EVENT_VCONN_EOS

TSVConnRead()

TSVIO

TS_EVENT_NET_CONNECT

TSNetConnect()

TSVConn

TS_EVENT_NET_CONNECT_FAILED

TSNetConnect()

TSVConn

TS_EVENT_HTTP_CONTINUE

TS_EVENT_HTTP_ERROR

TS_EVENT_MGMT_UPDATE

TSMgmtUpdateRegister()

継続関数を以下に列挙します。 :

When a handler function blocks, it blocks the event thread running it. This blocks all the continuations (internal ones along with those of plugins) in the event thread's queue. This may increase the worst-case latency for HTTP request processing. If there is enough blocking, this could increase CPU idle time, which may reduce proxy throughput. The Au test polite_hook_wait illustrates a method for using dynamic threading to do a blocking call without blocking any handler function. But the overhead of this method may cancel out the performance improvement, if blocking times are short.