2006年04月24日

CGI.pm 3.20がリリースされました

4月23日付けで、CGI.pm 3.20がリリースされていました。

Changesを見ると、変更点は3つ。

1つめ。CGI::Cookie->bake()メソッドへのpatch。これはdiffを見てみます。
@@ -182,7 +182,7 @@
           : Apache->request
   } if $MOD_PERL;
   if ($r) {
-      $r->headers_out->set('Set-Cookie' => $self->as_string);
+      $r->headers_out->add('Set-Cookie' => $self->as_string);
   } else {
       print CGI::header(-cookie => $self);
   }
set()メソッドからadd()メソッドに変更されています。set()メソッドを使うと、先に設定されていた他のパラメーターを消してSet-Cookieだけに置き換えてしまうから問題になることがあったのでしょう。Changesの記述から、特にmod_perl環境のための対処のようです。

…ゴメンなさい、自分ではCGI::Cookie->bake()は直接使ったことがないので想像でしかありません。

2つめ。Changesではstart_form()の問題のような記述ですが、実際に修正されているのはstart_multipart_form()でした。これもdiffを見てみます。
@@ -1825,9 +1826,7 @@
 sub start_multipart_form {
     my($self,@p) = self_or_default(@_);
     if (defined($p[0]) && substr($p[0],0,1) eq '-') {
-       my(%p) = @p;
-       $p{'-enctype'}=&MULTIPART;
-       return $self->startform(%p);
+      return $self->startform(-enctype=>&MULTIPART,@p);
     } else {
        my($method,$action,@other) = 
            rearrange([METHOD,ACTION],@p);
修正前は-enctypeを指定していても&MULTIPART、つまりmultipart/form-dataで強制的に書き換えられていました。これが、-enctypeを指定していた場合は、その指定した値が使われるようになっています。

3つめ。3.19で変更されたPATH_INFO周りのコードの修正のようだけど…。とりあえずこれもdiffを見てみます。
@@ -2778,7 +2777,8 @@
    my $raw_path_info   = $ENV{PATH_INFO}   || '';
    my $uri             = unescape($self->request_uri) || '';
 
-   $raw_script_name =~ s/\Q$raw_path_info$\E//;
+   my $protected    = quotemeta($raw_path_info);
+   $raw_script_name =~ s/$protected$//;
 
    my @uri_double_slashes  = $uri =~ m^(/{2,}?)^g;
    my @path_double_slashes = "$raw_script_name $raw_path_info" =~ m^(/{2,}?)^g;
正規表現の中で\Q\Eを使ってメタ文字を処理していたのを、quotemetaで先に処理しています。

でも…これって関係無いような?

元のコードで問題なのは、\Eの前に末尾を表すはずの$が入ってしまっていたことだと思うのだけど…。
  $raw_script_name =~ s/\Q$raw_path_info\E$//;
これなら問題ないと思うのだけど、他に問題あるのでしょうか?
posted by はしもと at 13:20| Comment(0) | TrackBack(0) | Perl
この記事へのコメント

この記事へのトラックバック