2010-11-27 52 views
1

如何使用mod_perl的過濾器/處理程序修改發佈請求內容?如何使用mod_perl修改發佈請求內容

我可以讀取PerlResponseHandler中的請求內容,但是如何將修改後的內容「附加」回請求中?

此外,我不想在PerlResponseHandler中執行此操作,因爲我想要請求的資源來處理響應生成部分。

任何幫助將不勝感激。

感謝。

+0

http://stackoverflow.com/questions/3083367/modify-post-request-in-mod-perl2 – daxim 2010-11-27 20:36:31

+0

感謝Daxim。要訪問請求腳本,我需要下載CPAN的libapreq2-2.12庫。我會試一試。 – 2010-11-29 04:53:56

+0

但是我認爲標準庫中必須有一些方法來讀取POST數據。謝謝。 – 2010-11-29 04:55:02

回答

1

如果添加use Apache2::RequestIOmy ($r) = @_;你可以做一個$r->print();

一個PerlResponseHandler不能修改請求數據,但即使它可能會是什麼點。只有PerlInputFilterHandler可以做到這一點,因爲它在獲得響應之前過濾輸入。

響應處理程序之後唯一的事情是輸出過濾器,日誌處理程序和清理處理程序。

 
package MyFilter; 

use strict; 

use base qw(Apache::Filter); 
use Apache2::Const qw(OK); 

sub handler: FilterRequestHandler { 
    my ($f) = @_; 
    while($f->read(my $buf, 1024)) { 
    # do something with $buf 
    $f->print($buf); 
    } 
    return OK; 
} 

1; 

重要的是要知道,你會得到大塊的數據。當您閱讀時,您可能會或可能不會在一次通話中發佈整個內容。

0

此代碼也可以運行 -

package MyApache2::Test7; 

    use strict; 
    use warnings; 

    use base qw(Apache2::Filter); 

    use Apache2::Connection(); 
    use APR::Brigade(); 
    use APR::Bucket(); 

    use Apache2::Const -compile => 'OK'; 
    use APR::Const  -compile => ':common'; 

use Apache2::Log(); 

    sub handler : FilterRequestHandler { 

Apache2::ServerRec->log_error("f*** starts"); 


     my ($f, $bb, $mode, $block, $readbytes) = @_; 
     my $c = $f->c; 
     my $bb_ctx = APR::Brigade->new($c->pool, $c->bucket_alloc); 
     my $rv = $f->next->get_brigade($bb_ctx, $mode, $block, $readbytes); 
     return $rv unless $rv == APR::Const::SUCCESS; 

     while (!$bb_ctx->is_empty) { 
      my $b = $bb_ctx->first; 

      if ($b->is_eos) { 
       $bb->insert_tail($b); 
       last; 
      } 

      my $len = $b->read(my $data); 

Apache2::ServerRec->log_error($len); 

      #$b = APR::Bucket->new($bb->bucket_alloc, lc $data) if $len; 

      #$b->remove; 
      #$bb->insert_tail($b); 

Apache2::ServerRec->log_error($data); 

Apache2::ServerRec->log_error("f*** ends"); 

$bb_ctx->cleanup; 

     } 

     return Apache2::Const::OK; 
    } 

    1;