2010-11-27 3 views
1

Comment modifier le contenu d'une demande de publication à l'aide du filtre/gestionnaire de mod_perl?Comment modifier le contenu d'une demande de publication à l'aide de mod_perl

Je peux lire le contenu de la demande dans PerlResponseHandler mais comment "rattacher" le contenu modifié à la demande?

De même, je ne veux pas faire cela dans PerlResponseHandler car je veux que la ressource demandée gère la partie de génération de réponse.

Toute aide sera appréciée.

Merci.

+0

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

+0

Merci Daxim. Pour accéder au script de requête, je dois télécharger la librairie libapreq2-2.12 du CPAN. Je vais essayer. –

+0

Cependant, je pense qu'il doit y avoir un moyen dans la bibliothèque standard pour lire les données POST. Merci. –

Répondre

1

si vous ajoutez use Apache2::RequestIO et de my ($r) = @_; vous pouvez faire un $r->print();

un PerlResponseHandler ne peut pas modifier les données de demande, mais même si elle pourrait ce serait le point. Seul un PerlInputFilterHandler peut le faire car il filtre l'entrée avant d'obtenir une réponse. La seule chose après un gestionnaire de réponse est les filtres de sortie, gestionnaire de journal et le gestionnaire de nettoyage.

 
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; 

Il est important de savoir que vous obtiendrez des données en morceaux. Lorsque vous lisez, vous pouvez ou ne pouvez pas afficher le tout en un seul appel.

+0

Merci Jeremy. Cependant, la fonction print() du script RequestIO est utilisée pour envoyer des données au client. Je ne comprends pas ce que cela signifie, mais comment puis-je lire les données POST en utilisant RequestIO? Aussi, comment puis-je le mettre à jour? Merci! –

+0

Le problème est qu'un PerlResponseHandler est la fin de la ligne pour les données POST. – Rahly

+0

Merci Jeremy pour sa réponse. J'ai obtenu que la demande peut être modifiée dans PerlInputFilterHandler mais puis-je le faire sans le module Apache2 :: Request? Comme je suis confronté à quelques problèmes dans l'installation de ce module. –

0

Ce code fonctionne aussi -

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

Vous devriez également pouvoir "imprimer STDERR" pour aller au fichier journal. – Rahly

Questions connexes