1

mod_perl のフィルター/ハンドラーを使用してポスト リクエストの内容を変更するには?

PerlResponseHandler でリクエスト コンテンツを読み取ることはできますが、変更されたコンテンツをリクエストに戻すにはどうすればよいですか?

また、要求されたリソースで応答生成部分を処理する必要があるため、PerlResponseHandler でこれを実行したくありません。

どんな助けでも大歓迎です。

ありがとう。

4

2 に答える 2

1

追加use Apache2::RequestIOしてからmy ($r) = @_;実行できる場合$r->print();

リクエストデータを変更するPerlResponseHandlerことはできませんが、できたとしても何の意味があるのでしょうか。PerlInputFilterHandler応答に到達する前に入力をフィルタリングするため、これを行うことができるのはa のみです。

応答ハンドラーの後にあるのは、出力フィルター、ログ ハンドラー、およびクリーンアップ ハンドラーだけです。

パッケージ MyFilter;

厳密に使用します。

ベース qw(Apache::Filter) を使用します。
Apache2::Const qw(OK); を使用します。

サブハンドラー: FilterRequestHandler {
  私 ($f) = @_;
  while($f->read(my $buf, 1024)) {
    # $buf で何かをする
    $f->print($buf);
  }
  OKを返します。
}

1;

チャンクでデータを取得することを知っておくことが重要です。読んだときに、1回の呼び出しで全体が投稿される場合とされない場合があります。

于 2010-11-28T02:51:32.017 に答える
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;
于 2010-12-02T08:19:20.107 に答える