2010-11-27 3 views
1

Wie zum Ändern Post-Anfrage Inhalt mit mod_perl Filter/Handler?So ändern Sie Post Request-Inhalt mit mod_perl

Ich kann Request-Inhalt in PerlResponseHandler lesen, aber wie kann ich geänderten Inhalt zurück in Anfrage "anhängen"?

Auch möchte ich dies in PerlResponseHandler nicht tun, wie ich angeforderte Ressource zur Handhabung der Antwort Generierung Teil möchte.

Jede Hilfe wird geschätzt.

Danke.

+0

http://stackoverflow.com/questions/3083367/modify-post-request-in-mod-perl2 – daxim

+0

Dank Daxim. Um auf das Anforderungsskript zugreifen zu können, muss ich die libapreq2-2.12-Bibliothek von CPAN herunterladen. Ich werde es versuchen. –

+0

Ich denke jedoch, dass es in der Standardbibliothek einen Weg geben muss, POST-Daten zu lesen. Vielen Dank. –

Antwort

1

, wenn Sie hinzufügen use Apache2::RequestIO und von my ($r) = @_; können Sie eine $r->print();

ein PerlResponseHandler tun können, nicht Anforderungsdaten ändern, aber selbst wenn es könnte, was wäre der Punkt. Nur ein PerlInputFilterHandler kann dies tun, da es die Eingabe filtert, bevor es zu einer Antwort kommt.

Das einzige nach einem Antworthandler sind die Ausgabefilter, der Protokollhandler und der Bereinigungshandler.

 
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; 

Wichtig zu wissen, dass Sie Daten in Chunks erhalten. Wenn Sie lesen, können Sie das Ganze möglicherweise in einem einzigen Anruf veröffentlichen.

+0

Danke Jeremy. Die Funktion print() im RequestIO-Skript wird jedoch zum Senden von Daten an den Client verwendet. Mir ist nicht klar, was es bedeutet, aber wie kann ich POST-Daten mit RequestIO lesen? Wie kann ich es aktualisieren? Vielen Dank! –

+0

Das Problem ist, dass ein PerlResponseHandler das Ende der Zeile für POST-Daten ist. – Rahly

+0

Danke Jeremy für die Antwort. Ich habe, dass die Anfrage in PerlInputFilterHandler geändert werden kann, aber kann ich das ohne Apache2 :: Request-Modul tun? Da ich einige Probleme bei der Installation dieses Moduls habe. –

0

Dieser Code funktioniert auch -

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; 
+0

Sie sollten auch in der Lage sein, "STDERR" zu drucken, um zur Protokolldatei zu gehen. – Rahly