CGI.pmのheaderでsend_cgi_headerをさせない
CGI.pmのheaderをHTTP
headerを作るためだけに使いたいというときに、普通のCGIなら良いのですが、Apache::Registoryなどmod_perlで動かしていると、
my $str = $q->header(-charset=>'EUC-JP');
とした瞬間にApacheにsend_cgi_header(send_http_header)が送られてしまって具合よろしくありません。
my $str = $q->header(-charset=>'EUC-JP'); $strになにか処理。 print $str;
というのはうまく動かない。実際のところ$strは空です。CGI.pmのheaderメソッドは便利なので、これをもう少し汎用的に使いたいのでこれを修正したいと。CGI.pmのその分のコードをみると、
my $header = join($CRLF,@header)."${CRLF}${CRLF}"; if ($MOD_PERL and not $nph) { $self->r->send_cgi_header($header); return ''; } return $header;
となっているので、$MOD_PERLの値をlocalで変更すればOKかなと思ってCGI.pmを継承してheader_as_stringメソッドを追加するモジュールをつくってみた。簡単なのでソース貼付け
package CGI::HeaderAsString; use strict; use CGI; use Exporter; use base qw(CGI); use vars qw($VERSION); $VERSION='0.01'; sub import{ if(grep { /:(?:standard|cgi)/ } @_){ my $header_as_string_sub= caller(0) . '::header_as_string'; my $redirect_as_string_sub= caller(0) . '::redirect_as_string'; { no strict 'refs'; *{$header_as_string_sub} = \&header_as_string; *{$redirect_as_string_sub} = \&redirect_as_string; } } goto &CGI::import; } sub header_as_string { my($self,@p) = CGI::self_or_default(@_); local $CGI::HEADERS_ONCE=0; local $CGI::MOD_PERL=0; return $self->header(@p); } sub redirect_as_string{ my($self,@p) = CGI::self_or_default(@_); local $CGI::HEADERS_ONCE=0; local $CGI::MOD_PERL=0; return $self->redirect(@p); } 1;