2006年4月18日

[SpamAssassin-JP 204] Re:レシピのマッチングについて

** SpamAssassin メーリングリスト **
** 注意:このメールへの返信は SpamAssassin-jp へ行きます **
久保です。

>> ですので、get_headerはリストコンテキストで処理結果を返すのではないかと思
>
>  少し追ってみたのですが、この時点ではちゃんと2行分の値を返していました。

なるほど。ここは期待どおりですね。

>  do_head_test のほうで下記のように printf デバッグして見ると、rulename1
> の位置では全部のrulenameが出てくるのですが、rulename2の位置では一番上に
> きたルールしか出てこないので、ここの処理が問題な気がするのですが、ここの
> ソースなにやってんだかわかりにくくて、そっからさき追えてません…

以下のコード部分は、SAがPerlで書かれているゆえんの、Perl特有の処理になっ
ています。つまり、プログラムコードを変数(ここでは$evalstr2)にどんどん書
き出して,後でevalでそのコードを「評価」(=実行)するというものです。

> $evalstr2 .= '
> sub '.$rulename.'_head_test {
> my $self = shift;
> $_ = shift;
> # ---Debug---
> printf( "rulename1:'.$rulename.'\n" );
> '.$self->hash_line_for_rule($rulename).'
> if ($self->get(q#'.$hdrname.'#, q#'.$def.'#) '.$testtype.'~ '.$pat.') {
> # ---Debug---
> printf( "rulename2:'.$rulename.' hdrname:'.$hdrname.'\n" );
> $self->got_hit (q#'.$rulename.'#, q{});
> '. $self->ran_rule_debug_code($rulename, "header", 1) . '
> }
> }';

このルーチンを取り囲んでいるwhileループの後ろで$evalstr2の値をデバッグ出
力して精査すれば、$def、$testtype、$patの値がどう解釈されているかなど、
追いかけられます。ただし非常に長いデバッグ出力になりますが。

実際のヘッダテストのコード全体を確認したければ、

1693: eval $evalstr;

の直前あたりに dbg($evalstr);でも入れてみたらどうでしょうか。他のheader
ルールに対するコードと見比べたら、何かわかるかもしれないですね。

--
----------------------------------------------------------------------
久保 元治 (株)サードウェア
Motoharu Kubo 274-0815 千葉県船橋市西習志野3-39-8
mkubo@xxxxx URL: http://www.3ware.co.jp/
Phone: 047-496-3341 Fax: 047-496-3370
携帯: 090-6171-5545
★弊社からのメールはZ-Linuxメールフィルタで全数検査しています★
★ ブログを始めました http://blogs.itmedia.co.jp/ossway/
--
SpamAssassin メーリングリスト
http://mm.apache.jp/mailman/listinfo/spamassassin-jp

投稿者 xml-rpc : 2006年4月18日 19:31
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/41308
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。