2014年6月16日月曜日

フック関数の一覧

続いて、フック関数の種類について書く。

フックポイントの一覧

Apache httpdで用意されているフックポイントにはどんなものがあるか。
あるフック関数の実行関数 ap_run_hogehoge()の実行箇所は一か所とは限らず、また必ず実行されるわけでもないので、どういった条件で実行されるかを明確にするのは難しいケースがある。

ひとまずは、httpd-2.4.9でAP_IMPLEMENT_HOOK_RUN_ALL/RUN_FIRST/VOID で定義されているフックポイントの一覧を作成した。
比較として、httpd-2.2.27からも同じマクロで定義されているフックポイントを並べている。
減ったフックポイントは見当たらない。追加されたポイントが、17あった。
分類は、下記で説明するmod_infoでの分類を書いた。が、もう少し細かく分類してもいいと思う。

seq フックポイント 処理タイプ フックポイント(2.2.27) 分類(mod_info)
1 access_checker RUN_ALL access_checker リクエスト処理系
2 access_checker_ex RUN_FIRST
リクエスト処理系
3 auth_checker RUN_FIRST auth_checker リクエスト処理系
4 check_config RUN_ALL
起動処理系
5 check_user_id RUN_FIRST check_user_id リクエスト処理系
6 child_init VOID child_init 起動処理系
7 child_status VOID
その他
8 create_connection RUN_FIRST create_connection リクエスト処理系
9 create_request RUN_ALL create_request リクエスト処理系
10 default_port RUN_FIRST default_port リクエスト処理系
11 dirwalk_stat RUN_FIRST
(なし)
12 drop_privileges RUN_ALL
起動処理系
13 end_generation VOID
その他
14 error_log VOID error_log その他
15 expr_lookup RUN_FIRST
その他
16 fatal_exception RUN_ALL fatal_exception その他
17 fixups RUN_ALL fixups リクエスト処理系
18 generate_log_id RUN_FIRST
リクエスト処理系
19 get_mgmt_items RUN_FIRST get_mgmt_items その他
20 get_suexec_identity RUN_FIRST get_suexec_identity (なし)
21 handler RUN_FIRST handler リクエスト処理系
22 header_parser RUN_ALL header_parser リクエスト処理系
23 http_scheme RUN_FIRST http_scheme, リクエスト処理系
24 insert_error_filter VOID insert_error_filter リクエスト処理系
25 insert_filter VOID insert_filter リクエスト処理系
26 insert_network_bucket RUN_FIRST
(なし)
27 log_transaction RUN_ALL log_transaction リクエスト処理系
28 map_to_storage RUN_FIRST map_to_storage リクエスト処理系
29 monitor RUN_ALL monitor その他
30 mpm RUN_FIRST
起動処理系
31 mpm_get_name RUN_FIRST
その他
32 mpm_query RUN_FIRST
その他
33 mpm_register_timed_callback RUN_FIRST
その他
34 note_auth_failure RUN_FIRST
リクエスト処理系
35 open_htaccess RUN_FIRST
(なし)
36 open_logs RUN_ALL open_logs 起動処理系
37 optional_fn_retrieve VOID optional_fn_retrieve 起動処理系
38 post_config RUN_ALL post_config 起動処理系
39 post_perdir_config RUN_ALL
(なし)
40 post_read_request RUN_ALL post_read_request リクエスト処理系
41 pre_config RUN_ALL pre_config 起動処理系
42 pre_connection RUN_ALL pre_connection リクエスト処理系
43 pre_mpm RUN_ALL pre_mpm 起動処理系
44 pre_read_request VOID
リクエスト処理系
45 process_connection RUN_FIRST process_connection リクエスト処理系
46 quick_handler RUN_FIRST quick_handler リクエスト処理系
47 test_config VOID test_config 起動処理系
48 translate_name RUN_FIRST translate_name リクエスト処理系
49 type_checker RUN_FIRST type_checker リクエスト処理系

mod_infoで見るフック関数情報

mod_infoで各フックポイントに登録されているフック関数の情報を一覧することができる。
http://localhost/server-info?hooks
ただ、調べてみると、出力されるフックポイントは一部欠けている(上の表で「(なし)」と書いたのが欠けているフックポイント)。
関数も関数名が一覧されるわけではなく、その関数を登録したファイル名が出力されている。

処理を見ると、ap_hook_get_hogehoge()でhogehogeフックポイントの登録情報(apr_array_header_t情報)を取得する。
apr_array_header_t情報は、配列情報の管理情報で、内部にメモリプールの情報なども持っているが、基本的には、apr_array_header_t.nelts 個の有効な要素を持つ配列 apr_array_header_t.elts の格納庫だ。
このapr_array_header_t構造体自体は汎用で フック関数の登録先に利用する場合にはapr_array_header_t.eltsには、各フック関数用の構造体 ap_LINK_hogehoge_t が格納される。

mod_infoで出力されるのは、ap_LINK_hogehoge_t.szNameで、ここにはモジュールのCファイル名が入っている。
各モジュールごとにフック関数の型が異なるので、この構造体の個々の定義は異なっているが、その辺気にしなければ(実際に関数をを呼び出すのでなければ)、ダミーの構造体で処理可能らしい。mod_infoでは、処理用の構造体を用意してこのモジュールCファイル名と、実行時の順序を制御するための値 ap_LINK_hogehoge_t.nOrder を出力している。



引き続き、主なフック関数を確認すれば、フック関数の全体のイメージが把握できるのではないか。

0 件のコメント:

コメントを投稿