2009-04-05 8 views
3

J'utilise mod_perl 2 avec Apache 2.2.3 sur Red Hat 5.2, et j'essaie d'accéder aux en-têtes de requête, mais la méthode Apache2 :: RequestRec headers_in (ou plutôt, sa valeur de retour) ne se comporte pas comme je m'attendrais.mod_perl headers_in ne fonctionne pas

fragment de code

:

$logger->warn('version ' . $mod_perl::VERSION); 
$logger->warn('r ' . $r); 
my $headers = $r->headers_in; 
$logger->warn('headers ' . $headers); 
my $accept = $headers->get('Accept'); 
$logger->warn('got $accept'); 
$logger->warn($accept); 

donne la sortie du journal suivant:

WARN version 2.000004 
WARN r Apache2::RequestRec=SCALAR(0x2ae0598e9ef0) 
WARN headers APR::Table=HASH(0x2ae06cad15a0) 

avec l'exécution paraissant arrêter dès que tout accès à l'APR :: Table est essayée. L'interface liée à la PEE :: Table a le même effet - à savoir changer la ligne get('Accept') à:

my $accept = $headers->{Accept}; 

donne exactement la même sortie du journal.

Selon la documentation liée ci-dessus:

Ce tableau est disponible à partir de la phase PerlHeaderParserHandler

Je me attends à mon code, en cours d'exécution dans la phase PerlResponseHandler, pour être en mesure d'accéder les en-têtes.

Est-ce que quelqu'un a des idées de ce que je fais mal?

Éditer: L'utilisation de données :: Dumper n'a pas vraiment clarifié les choses du tout.

code:

use Data::Dumper; 
$logger->warn(Dumper($r)); 
my $headers = $r->headers_in; 
$logger->warn($headers); 
$logger->warn(Dumper($headers)); 
$logger->warn('have dumped $headers'); 

Sortie:

WARN $VAR1 = bless(do{\(my $o = '47143456365192')}, 'Apache2::RequestRec'); 

WARN APR::Table=HASH(0x2ae071b06fd0) 

Il semble donc que d'essayer d'entrer dans les en-têtes $, même par le biais de données :: résultats tombereau dans l'arrêt d'exécution.

Modifier: La tentative de définition de l'un des en-têtes échoue également.

$logger->warn('reset accept'); 
$r->headers_in->{'Accept'}= 'everything'; 
$logger->warn('post set accept'); 

butées sortie connectent au point

WARN reset accept 

. J'ai aussi essayé l'alternative set(Accept => 'everything'), avec le même résultat.

+0

Que contient l'objet $ headers? Pouvez-vous montrer une sortie Data :: Dumper? –

Répondre

0

Problème trouvé:

je devais ajouter

use APR::Table; 

quelque part. Un peu bizarre qu'il soit heureusement capable de créer un objet APR :: Table.

1

Y a-t-il quelque chose dans les journaux Apache? Il semble que si votre code cesse d'être exécuté, il devrait y avoir une erreur quelque part indiquant pourquoi.

+0

Ces avertissements entrent dans le journal des erreurs - il n'y a rien d'autre après la sortie du journal que j'ai enregistrée. – Cebjyre

0

Avez-vous essayé d'obtenir l'en-tête Accept sans attribuer l'objet d'en-tête à tête de $:

my $accept = $r->headers_in->get('Accept'); 

Cela fonctionne dans mon code en cours d'exécution dans la phase PerlResponseHandler.

+0

C'est ainsi que j'essayais d'y accéder pour la première fois, je l'ai divisé pour clarifier la partie qui causait les problèmes – Cebjyre