1

如何使用 mod_perl 的过滤器/处理程序修改发布请求内容?

我可以在 PerlResponseHandler 中读取请求内容,但如何将修改后的内容“附加”回请求中?

另外,我不想在 PerlResponseHandler 中执行此操作,因为我希望请求的资源来处理响应生成部分。

任何帮助将不胜感激。

谢谢。

4

2 回答 2

1

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

aPerlResponseHandler不能修改请求数据,但即使它可以有什么意义。只有 aPerlInputFilterHandler可以做到这一点,因为它会在得到响应之前过滤输入。

响应处理程序之后的唯一内容是输出过滤器、日志处理程序和清理处理程序。

包我的过滤器;

使用严格;

使用基础 qw(Apache::Filter);
使用 Apache2::Const qw(OK);

子处理程序:FilterRequestHandler {
  我的 ($f) = @_;
  while($f->read(我的 $buf, 1024)) {
    # 用 $buf 做一些事情
    $f->打印($buf);
  }
  返回确定;
}

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 回答