CGI::Cookie hibajelenség

CGI::Cookie hibajelenség
2012-10-05T22:28:43+02:00
2012-10-11T22:26:16+02:00
2022-11-27T02:35:34+01:00
johnnyvj
Sziasztok!
Megpróbálok itthon a Win XP-mre egy Vertigo-val és egy Strawberry Perl-el feltelepíteni és használni egy fejlesztői környezetet, hogy ne kelljen az éles szervert kiakasztanom egy-két végtelen ciklussal :$
A Vertigo megy. Perl (parancssorból) elindul.
Odamásolom "neki" a teljes weboldalt és ekkor jön a meglepetés: gond van. Lássuk csak a logot majd pedig jött a parancssor.
perl index.pl
Azt mondja nekem, hogy
Can't call method "value" on an undefined value at kozos.pl line 2009.

Hopszi. Lássuk csak mi is van ott:
sub SutikBeolvasasa { # Beolvassuk a sütijeinket (ha vannak) # ==================================== if ($TesztMod ne 1) { %cookies = fetch CGI::Cookie; } # A mindenkori szavazás ID-je # =========================== $SzavazID=0; if (length($cookies{'SzavazID'}) ne 0) { $SzavazID=$cookies{'SzavazID'}->value; } # Az RndPlaySession (?m=42) értékei # ================================= $RndPlaySession=0; if (length($cookies{'RndPlaySession'}) ne 0) { $RndPlaySession=$cookies{'RndPlaySession'}->value; } }
Ezen belül is a 2009-es sor ez:
$SzavazID=$cookies{'SzavazID'}->value;
Szóval, az éles környezetben egy Debian Linux van Apache szerverrel és Perl-el. Ott nem okoz problémát és fut (már legalább 3 éve!). Most is :)
Mit szúrok el itthon - azon kívül, hogy hozzákezdtem...

Köszi szépen előre is!
Mutasd a teljes hozzászólást!
Szia,

Szerintem google a barátod.
Én is ott találtam ezt.

Üdv
Mutasd a teljes hozzászólást!

  • Szia,

    Három különböző okot tudok elképzelni:
    - (a leginkább valószínű) más Perl verzió (én ActivePerl-t szoktam Windows-on használni, eddig nem csalódtam), vagy a Perl csomagban, vagy a natív részekben van valami implementációs különbség
    - nem ugyanaz a kódod bemenete (ezt könnyen kiderítheted, ha minden bejövő paramétert és sütit logolsz (mínusz fájl uploadkor a tartalom)
    - benéztél valamit: nincs fent a CGI::Cookie csomag a windows-os telepítődben (jártam már úgy, hogy utólag kellett felrakni konzolból csomagot); van egy redirekt ami miatt ott nincs is olyan változó; kitörlöd a cookie-t kódból a hívás előtt, stb.

    (közhely/spanyolviasz on)Fejleszteni úgy érdemes, hogy az éles működéshez leginkább hasonlító környezetben tesztelsz, egyébként könnyen úgy járhatsz, mint most(közhely/spanyolviasz off)

    Üdv,
    Magic
    Hja, vagy 9-10 évvel ezelőtt nekem is megvolt a végtelen ciklus
    Mutasd a teljes hozzászólást!
  • - Nos, ha nem lenne a Perl alá feltelepítve a CGI::Cookie, akkor már a use-nál ki kellett volna akadnia, de azért levettem és visszatettem -> nem szünt meg a hiba.

    - Még nincs semmi kódbemenet, mert parancssorból indítottam el azok után, hogy a böngésző alól elindítva a Apache error logjába már benaplózta ugyanezt a hibát :(

    Azt hiszem, megpróbálom feltenni az ActivePerl-t. Anno használtam, csak valamiért ez a földieper jutott először az eszembe :)
    Ja, sajnos, nincs még egy gépem, hogy egy Debian-t + Apache-ot meg ilyeneket feltegyek :(

    A végtelen ciklushoz nekem elég volt hajnali 2-kor két karakter felcserélése :D

    Köszi!
    Mutasd a teljes hozzászólást!
  • Leszedtem a Strawberry Perl-t. Feltettem az ActivePerl-t (ja, tényleg nem alapértelmezett a CGI::Cookie csomag, így azt is feltettem) és képzeljétek: ugyanaz :(
    Komolyan mondom: a törpöm tele van
    Miért nem mentem én cukrásznak?

    Hozzátenném:
    Így, parancssorból (tehát perl index.pl) éles környezetben sem futtattam még a progit. De tény, hogy ott lefut a fenti hibaüzenet nélkül.
    Mutasd a teljes hozzászólást!
  • Szia,

    Még egy dolog: nem vagyok biztos benne, hogy a CGI modul helyesen működik webszerver nélkül (szóval parancssorból), meg hát nem is az az üzemszerű működés. Itt el tudom képzelni, hogy win/linux másképp müxik.

    Szerintem meg kéne próbálnod böngészőből.

    A másik gondolatom meg, hogy a
    if (length($cookies{'SzavazID'}) ne 0) {
    sor nem megfelelően ellenőríz.

    Voálá:

    %proba = (); if(length($proba{'a'}) ne 0){ print "theoretically ok\n"; print "$proba{'a'}\n"; }else{ print "empty:(\n"; } print "second round\n"; if(exists $proba{'a'}){ print "theoretically ok\n"; print "$proba{'a'}\n"; }else{ print "empty:(\n"; }

    Eredmény:

    C:\temp>perl proba.pl theoretically ok second round empty:( C:\temp>

    Asszem pipálhatjuk.

    Üdv.
    Mutasd a teljes hozzászólást!
  • Tetszik az elgondolás - gondolok itt az "exist" használatára és köszönöm!

    Viszont: ahogy azt kettővel korábban írtam
    - Még nincs semmi kódbemenet, mert parancssorból indítottam el azok után, hogy a böngésző alól elindítva a Apache error logjába már benaplózta ugyanezt a hibát :(

    böngészőből hívva az index.pl-t, ugyanez a helyzet.

    Most - de CSAK egyenlőre - úgy oldadottam meg, hogy kommenteztem a megfelelő sort (igazából most csak második 'value'-t tartalmazó sor érdekel a fejlesztés miatt) fix értékadással helyettesítettem.
    De ez mindenképp tákolás, mert mi van, ha fel akarom tenni az éles verzióba és elfelejtkezem róla.
    Mutasd a teljes hozzászólást!
  • Meglehet, hogy a $cookies{'SzavazID'} ebben a környezetben nem is süti, így nem lehet rá meghívni a value metódust és ettől a hibaüzenet.

    Esetleg megpróbálnám az
    if (length($cookies{'SzavazID'}) ne 0)helyett csak simán
    if ($cookies{'SzavazID'})
    Mutasd a teljes hozzászólást!
  • Footprint!
    Hogy érted, hogy "ebben a környezetben"? Mármint, hogy parancssorból indítva? Mert ezt megérteném, de akkor az itthoni Apache alól miért nem lesz olyan környezet, míg a Debian alatti Apache alól simán annak véli.
    Komolyan bedilizek
    Mutasd a teljes hozzászólást!
  • Akkor induljunk el a kályhától.

    %cookies = CGI::Cookie->fetch; for (keys %cookies) { print "$_ <br>"; }

    Ezzel legalább látható, hogy megkapja-e egyáltalán a program a sütit.
    Mutasd a teljes hozzászólást!
  • Nos, egy lecsupaszított programba tettem ezt be:

    #!perl use CGI::Cookie; use English; %cookies = CGI::Cookie->fetch; for (keys %cookies) { print "$_ <br>"; } exit;

    Természetesen nem jön válasz és nincs hibaüzenet.
    Mutasd a teljes hozzászólást!
  • Báár, most - hogy túl vagyok a házimunkákon :) - lehet, hogy arra voltál kíváncsi, webszerver alól meghívva mit ad vissza. Na, nem sokára azt is megkukkantom :)

    Nos, megjönnek. Természetesen.

    Tehát még mindig az a bajom, hogy itthon el sem indul a program!
    Mutasd a teljes hozzászólást!
  • Hello!

    A problema itt, hogyha

    a) nem webserverbol hivod meg, hanem parancssorbol, akkor nincs neki honnet cookie-t vennie.

    b) webserverben nem alitottal be cooke-t soha meg

    Ilyenkor vagy die vagy csinalsz egy ureset. Legjobb lenne ha felhuznal egy apache-t, az is van windowsra, es az alol fejlesztenel.

    if ($TesztMod ne 1) { %cookies = fetch CGI::Cookie; if (! defined %cookies){ warn "Cookies not found!\n"; my $c = CGI::Cookie->new(-name => 'foo', -value => ['bar','baz'], -expires => '+3M'); } $cookies{'foo'} = $c; }
    Mutasd a teljes hozzászólást!
  • Helló apaczko!

    Értelek, és köszi. Ám amikor megírtam a hibát, akkor írtam, hogy itthonra egy Vertigót tettem fel, ami egy MySQL-t, PHP-t és Apache szervert telepít fel és indít el szépen.
    Ha ezt a weboldalt hívom meg, akkor az Apache error.log-jába is ugyanez a hiba naplózódik be és így el sem indul az index.pl :(
    Mutasd a teljes hozzászólást!
  • Szia,

    Van még pár lehetőség, ami miatt üres az a változó:
    - a cookie nem arra a site-ra megy, így a böngésző eldobja
    - ki van kapcsolva a süti küldés böngésző oldalon
    - rosszul állítod be a sütit (pl. benne van a külső gép (ahonnan megy) domain neve (régen csináltam ilyet, nem tudom, hogy ez valós probléma lehet-e), na ezt biztosan nem fogod megkapni otthon localhost/... valami címmel hivatkozva...

    Két dolgot tehetsz:
    Elhiteted az otthoni gépeddel, hogy a http://innenmegyadolog.hu az a te géped: (vagyis a windows hosts fájljába felveszed a domaint és beírod a saját ipd mellé), újra megpróbálod, miután a böngészőt megnézted, hogy nincs-e kikapcsolva a sütiküldés (a site-ot meg rakd be a trusted site-ok közé, biztos ami biztos)
    Ha nem segít, akkor marad az, hogy megnézed mi megy a csatornán.
    Én erre a TcpTunnelGUI-t ajánlanám, mint facsipesz eszközt, engem párszor már kihúzott a bajból.
    Sajna Java kell hozzá, de ez a gonosz világ már csak ilyen

    Kb. ennyi használni, ha van jre a gépen:

    1, Bring up a DOS Prompt window (Start/Run, type "cmd") and type:

    java -cp "c:\temp\soap-2.3.1.jar"
    org.apache.soap.util.net.TcpTunnelGui 6789 localhost 80

    The parameters for TcpTunnelGui are:
    - listening port; here, we picked port 6789,
    - tunnel host &#8211; e.g., localhost or name of web server
    - tunnel port &#8211; e.g., 80 or 8080.

    2, You should see a TCP Tunnel GUI which monitors HTTP requests and responses. The GUI left window will display the HTTP request messages and the right window will display the HTTP response messages.


    Szerintem akkor fog megjelenni az isteni szikra, ha összehasonlítod a működő változat request-response párjait a nem működőével (szóval érdemes kimásolni őket egy-egy text fájlba, majd összehasonlítani).

    Üdv,
    Magic
    Mutasd a teljes hozzászólást!
  • Szia Magic!

    Köszi a javaslatodat!
    Érdekesnek találom a progit, amit javasoltál, meg fogom majd kukkantani, de sajna - ahogy az a leírásomból is látszik - ez nem fog rávilágítani arra, hogy a Perl miért köt bele még futás előtt (tehát elemzést követően) az adott sorba, függetlenül attól, hogy őt az Apache alól vagy közvetlenül parancssorból indítom el.
    Mivel itthoni fejlesztésről van szó, az első dolgom volt, hogy a hosts-t átírjam (erre készítettem is lustaságból egy, illetve két kicsi cmd-t).
    Mutasd a teljes hozzászólást!
  • Szia,

    Szerintem google a barátod.
    Én is ott találtam ezt.

    Üdv
    Mutasd a teljes hozzászólást!
  • Magic!

    Köszönöm szépen! 5x
    És Google barátunknak is
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd