mod_chxj を Apache 2.2 で動かす

mod_chxj を試しに使ってみようと、mod_chxj のバージョン 0.8.0 のソースコードをダウンロードしてきて、make を始めたのですが、開発機の Apache のバージョンが 2.2 だったため、いろいろはまりました(mod_chxjApache 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 です。