如何使用mod_perl修改post请求内容

发布于 2024-10-04 22:29:29 字数 195 浏览 5 评论 0原文

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

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

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

任何帮助将不胜感激。

谢谢。

How to modify post request content using mod_perl's filter/handler?

I can read request content in PerlResponseHandler but how do I "attach" modified content back into request?

Also, I don't want to do this in PerlResponseHandler as I want requested resource to handle response generation part.

Any help will be appreciated.

Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

灼痛 2024-10-11 22:29:29

如果您添加 use Apache2::RequestIO 并从 my ($r) = @_; 您可以执行 $r->print();< /code>

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;

重要的是要知道,您将获得分块的数据。当您阅读时,您可能会也可能不会在一次通话中获得全部内容。

if you add use Apache2::RequestIO and from my ($r) = @_; you can do a $r->print();

a PerlResponseHandler can not modify request data, but even if it could what would be the point. Only a PerlInputFilterHandler can do that as it filters input before it gets to a response.

The only thing after a response handler is the Output Filters, Log Handler, and the Cleanup Handler.

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;

Important to know, that you will get data in chunks. When you read you may or may not get the whole posted in a single call.

从此见与不见 2024-10-11 22:29:29

此代码也有效 -

  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;

This code also works -

  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;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文