Как изменить содержание пост-запроса с помощью mod_perl - PullRequest
1 голос
/ 27 ноября 2010

Как изменить содержимое пост-запроса, используя фильтр / обработчик mod_perl?

Я могу прочитать содержимое запроса в PerlResponseHandler, но как мне «прикрепить» измененный контент обратно в запрос?

Кроме того, я не хочу делать это в PerlResponseHandler, поскольку я хочу, чтобы запрошенный ресурс обрабатывал часть генерации ответа.

Любая помощь будет оценена.

Спасибо.

Ответы [ 2 ]

1 голос
/ 28 ноября 2010

если вы добавите use Apache2::RequestIO и из my ($r) = @_; вы можете сделать $r->print();

a PerlResponseHandler, то не сможете изменить данные запроса, но даже если это возможно, в чем смысл.Только PerlInputFilterHandler может сделать это, поскольку он фильтрует входные данные до того, как получит ответ.

Единственная вещь после обработчика ответа - это Фильтры вывода, Обработчик журнала и Обработчик очистки.*

Важно знать, что вы будете получать данные кусками.Когда вы читаете, вы можете или не можете опубликовать все сообщение за один звонок.

0 голосов
/ 02 декабря 2010

Этот код также работает -

  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;
...