mod_chxj を Apache 2.2 で動かす
mod_chxj を試しに使ってみようと、mod_chxj のバージョン 0.8.0 のソースコードをダウンロードしてきて、make を始めたのですが、開発機の Apache のバージョンが 2.2 だったため、いろいろはまりました(mod_chxj は Apache 2.0 で動かすことが前提のようです)。
src/mod_chxj.c
APR_BRIGADE_FOREACH マクロがどうのこうのと言われて、コンパイルが止まってしまいました。調べてみると、現在では推奨されていない使い方だったので、パッチを当てました。
http://www.schumann.cx/docs/apr-util/group__APR__Util__Bucket__Brigades.html#a80
976 /* broke down deprecated APR_BRIGADE_FOREACH() macro */ 977 b = APR_BRIGADE_FIRST(ibb); 978 while (b != APR_BRIGADE_SENTINEL(ibb)) { 979 //APR_BRIGADE_FOREACH(b, ibb) { 980 rv = apr_bucket_read(b, &data, &len, APR_BLOCK_READ); 981 if (rv != APR_SUCCESS) { 982 DBG(r, "apr_bucket_read() failed"); 983 return rv; 984 } 985 986 if (data != NULL) { 987 data_bucket = apr_palloc(r->pool, len+1); 988 memset((void*)data_bucket, 0, len+1); 989 memcpy(data_bucket, data, len); 990 DBG1(r, "(in)POSTDATA:[%s]", data_bucket); 991 992 data_brigade = apr_pstrcat(r->pool, data_brigade, data_bucket, NULL); 993 } 994 995 if (APR_BUCKET_IS_EOS(b)) { 996 break; 997 } 998 999 /* broke down deprecated APR_BRIGADE_FOREACH() macro */ 1000 b = APR_BUCKET_NEXT(b); 1001 } 1002 apr_brigade_cleanup(ibb);
src/chxj_cookie.c
Apache 2.2 を再起動したら、今度は ap_run_http_method がないと言われてしまいました。Apache 2.0 -> 2.2 では、ap_run_http_method -> ap_run_http_scheme になっているようなので、パッチを当てて再コンパイルしました。
117 if (! has_refer) { 118 apr_uri_parse(r->pool,r->uri, &parsed_uri); 119 refer_string = apr_psprintf(r->pool, 120 "%s://%s%s", 121 /* apache2.0 -> 2.2 */ 122 ap_run_http_scheme(r), 123 //ap_run_http_method(r), 124 r->hostname, 125 apr_uri_unparse(r->pool, 126 &parsed_uri, 127 APR_URI_UNP_OMITSITEPART));
httpd.conf
以下の設定を行うことで、とりあえずすべてのファイルが変換対象になります。mod_chxj は、指定されたユーザーエージェント以外のときは、そのままファイルを返すようなので、PC 用の通常のブラウザで見るときはとくに影響を受けません。
<IfModule mod_chxj.c> ChxjCookieDir /tmp/chxj_cookie ChxjCookieTimeout 1800 ChxjLoadDeviceData /etc/apache2/chxj/device_data.xml ChxjLoadEmojiData /etc/apache2/chxj/emoji.xml ChxjConvertRule ".+$" "EngineOn,CookieOn" "UTF-8" "PC" <Location /images> ChxjImageEngine On ChxjImageCacheDir /tmp/chxj_image </Location> </IfModule>
ちなみに PC 用のブラウザでチェックしたいときは、FireFox の UserAgentSwitcher が便利です。携帯用のユーザーエージェントに「DoCoMo/2.0 SH901iC(c100;TB;W24H12)」などを指定すれば OK です。