2010-11-09 30 views
0

J'ai un ensemble de scripts qui fonctionnent sous ActivePerl 5.10. Toutefois, en vertu Strawberry Perl 5.10, je reçois un message d'erreur étrange:Strange Apache2 :: Cookie erreur sous Strawberry Perl et mod_perl2

Can't locate object method "cookie_class" via package "MyCookie" (perhaps you forgot to load "MyCookie"?) at C:/strawberry/perl/site/lib/Apache2/Cookie.pm line 41. 

Cependant, MyCookie est le nom du cookie lui-même, pas de package Perl.

Si je commente la ligne 41 de Cookie.pm, le script s'exécute, mais je ne parviens plus à obtenir ou à configurer des cookies.

Le message d'erreur semble quelque peu correct car je ne trouve pas cookie_class non plus (sauf si cela est mentionné dans les fichiers POD.) Cela étant dit, il en est de même pour mon installation ActivePerl.

Je pense que c'est dans C:\strawberry\perl\site\lib\auto\APR\Request\Request.dll - comment venir, il ne peut pas le trouver sous Strawberry, mais peut sous ActivePerl?

Répondre

2

Changer votre code pour utiliser le schéma 2.X comme ceci:

my $j = Apache2::Cookie::Jar->new($r); 
my $cookie = $j->cookies("MyCookie"); # works! go figure... 

plutôt que l'ancienne méthode: (. Pour une raison quelconque, cela semblait le fixer)

local our %cookies = Apache2::Cookie->fetch($r); # error was happening here 
local our $cookie = $cookies{"MyCookie"}; 

+1

Bizarre que la vieille école 'fetch' a travaillé avec ActivePerl mais pas Strawberry. 'Apache2 :: Cookie :: Jar' fonctionne et je suppose que c'est la bonne façon de le faire. –

+0

C'est bizarre - et maintenant j'ai des problèmes avec Apache2 :: Request :: param qui sont tout aussi bizarres, mais je pense que je le fais déjà "comme il faut". Quoi qu'il en soit, merci pour la confirmation et les accessoires pour m'aider tellement. :) – Kev

0

Quelque part, vous ou quelqu'un d'autre transmet une chaîne à une fonction qui attend un objet. Votre meilleure première étape dans le débogage serait de charger Carp::Always de sorte que vous puissiez obtenir un backtrace et découvrir ce qui se passe réellement.

+0

J'ai fait une trace de pile. Mais ce qui se passe vraiment, c'est la même chose qui se passe toujours: '% cookies = Apache2 :: Cookie-> fetch ($ r)' où '$ r' est un objet' Apache2 :: RequestRec'. Le même code fonctionne correctement sous ActivePerl sans modification. En outre, au moment où le code se bloque, MyCookie n'est pas encore vérifié (pas de toute façon il est passé à 'fetch()), donc je suppose que cela provient du cookie du navigateur. – Kev

+0

J'ai supprimé le cookie du navigateur, et bien sûr, il ne commet plus d'erreurs. Cependant, maintenant il ne réussit plus à définir le cookie. – Kev

1

Êtes-vous en train de mélanger les DLL apreq entre les versions Strawberry et ActivePerl? Ou mélangez les DLLs apreq-1 et apreq-2 d'une façon ou d'une autre?

La zone autour de l'infraction cookie_class appel est ceci:

my $jar = $req->jar or return; 
$jar->cookie_class(__PACKAGE__); 
return $jar->get(shift) if @_; 

La méthode cookie_class ne vient de Request.dll et $req est vérifié avant jar() type sur la est appelée.

+0

Pas que je puisse voir. J'ai suivi les instructions à http://mail-archives.apache.org/mod_mbox/perl-modperl/201007.mbox/%[email protected]%3E et ils l'ont installer mod_perl2 de spécifique aux fraises de KMX construire. – Kev

+1

Qu'est-ce que vous obtenez lorsque vous appelez "$ r-> jar" vous-même? Avez-vous un objet? Un scalaire? Quelque chose qui a une méthode "cookie_class()"? –

+0

J'ai 'Impossible de localiser la méthode d'objet" jar "via le paquet" Apache2 :: RequestRec "'. – Kev