Apacheモジュールを作る
提供:Asterisk Works Wiki
目次 |
開発環境の整備
Linux環境でソースからApacheをインストールしたなら、必要な環境はほぼ揃っている。
パッケージでApacheをインストールしたなら、apxsが使える必要がある。
ubuntuなら次のパッケージをインストールする
> sodo apt-get install apache2-threaded-dev
すると、apxs2というコマンドが使えるようになる。
雛形作成からコンパイル、インストールまで
モジュールの雛形を作成するには次のコマンドを実行する
> apxs -g -n mymodule
すると mymodule ディレクトリが作成され、次の3ファイルが生成される。
- Makefile
- mod_mymodule.c
- modules.mk
このmod_mymodule.cに実装していく。
コンパイル&インストール
mymoduleディレクトリで次のコマンドを実行するとコンパイルされ、APACHE_HOME/modulesにmod_mymodule.soがコピーされる
> make > sudo make all install
実際にモジュールを使うには次のモジュール呼び出しをhttpd.confに追加する
LoadModule mymodule_module modules/mod_mymodule.so
次のコマンドだと、httpd.confへのLoadModule追加までやってくれる
> sudo apxs -c -i -a mod_mymodule.c
ハンドラー
Apacheのモジュールを実装するとは、ハンドラーを実装することと言っても良い。
request_rec構造体
include/httpd.h で定義されている構造体。HTTPリクエストの情報を格納する。
ハンドラーの引数として渡される。
ハンドラー内でリクエスト/レスポンス情報を操作するのに使う。
| メンバー名 | 説明 |
|---|---|
| handler | 処理するハンドラの名称 |
| content_type | Content-Typeヘッダ取得 |
| header_only | HEADリクエストかどうか |
| pool | リクエスト毎のメモリプール |
| args | QUERY_STRING値 |
| method_number | リクエストメソッドの数値表現? |
| headers_in | リクエストヘッダ apr_table_t型 |
| headers_out | レスポンスヘッダ apr_table_t型 |
| uri | URI |
| filename | DISK上のファイル名 |
ハンドラー関数の戻り値
ハンドラーの戻り値として返せる値はマクロがhttpd.hに定義されている。
| 戻り値として定義されている定数 | 意味 |
|---|---|
| OK | 処理成功 |
| DECLINED | 次のモジュールに処理を任せる |
| HTTP_NOT_FOUND | |
| HTTP_FORBIDDEN | |
| HTTP_INTERNAL_SERVER_ERROR |
ディレクティブ
ディレクティブを作るには
これらのマクロはhttp_config.hに定義されている。
- AP_INIT_TAKE1
- パラメータが一つのディレクティブを定義
- AP_INIT_TAKE2
- パラメータが2つのディレクティブを定義
便利なユーティリティ
文字列の操作
- 文字列のコピー
char *str = apr_pstrdup(p, src);
- 文字列の連結
char *str = apr_pstrcat(p, str1, str2, NULL);
- 文字列のフォーマット
char *str = apr_psprintf(p, “%d\n”, n);
動的配列
- 配列生成
apr_array_header_t *arr = apr_array_make(p, 10, sizeof(char *));
- 要素の追加
*(const char **)apr_array_push(arr) = val;
- 要素数の取得
arr->nelts;
- 配列実態
char **elts = arr->elts;
テーブル
- テーブル生成
apr_table_t *tbl= apr_table_make(p, 12);
- 値のセット
apr_table_set(tbl, key, val);
- 値の取得
char *val = apr_table_get(tbl, key);
- 値の削除
apr_table_unset(tbl, key);
Apache API
コンテンツの出力
ap_rputs(const char *str, requst_rec *r) ap_rwrite(const void *buf, int nbytes, requst_rec *r) ap_rprintf(request_rec *r, const char *fmt, …);