in reply to Multiple Cookies with CGI::Application

I been looking into this more since I've had some sleep :) From the CGI pod:

To create multiple cookies, give header() an array reference:
print $query->header(-cookie=>[$cookie1,$cookie2]);

I've done this before to set mutliple cookies and its worked, so I assume that this part is ok.

Delving deeper into the code, it seems the reason why I'm getting a '' from the header() method is because of the following in CGI.pm:

if ($MOD_PERL and not $nph) { my $r = Apache->request; $r->send_cgi_header($header); return ''; }

If I print the header out as it appears just before the if , it contains both cookies as seen below

Status: 200 Ok
Set-Cookie: sessionID=blahblahblah; path=/
Set-Cookie: userID=test123; path=/
Date: Sun, 28 Jul 2002 02:31:59 GMT
Content-Type: text/plain; charset=ISO-8859-1

If I telnet to the server the headers I receive are:

HTTP/1.1 200 OK
Date: Sun, 28 Jul 2002 03:17:15 GMT
Server: Apache-AdvancedExtranetServer/1.3.23 (Mandrake Linux/4mdk) mod_ssl/2.8.7 OpenSSL/0.9.6c PHP/4.1.2
Content-Type: text/plain; charset=ISO-8859-1
Set-Cookie: userID=test123; path=/
X-Cache: MISS from quigon.nomis52.com
Transfer-Encoding: chunked

So my belief is that something must be going astray when send_cgi_header() is called.

This problem is driving me crazy.....

Nomis52

Replies are listed 'Best First'.
Re: Re: Multiple Cookies with CGI::Application
by sedhed (Scribe) on Jul 28, 2002 at 05:00 UTC

    Okay Nomis52, I've done some testing on a local server, and it works for me, setting both cookies each time.

      Tested version info:
    • Apache 1.3.12
    • mod_perl 1.26
    • CGI 2.81
    • CGI::Application 2.5

    I tried multiple cookies using CGI.pm directly, and I tried the same using CGI::Application, all under mod_perl, and under each scenario I get both cookies without issue. I know you didn't want to hear that :)

    What happens when you try a very simple script like:

    #!/usr/bin/perl use CGI::Application; my $a = new CGI::Application; my $c1 = $a->query->cookie(-name=>'userID', -value=>'test123', ); my $c2 = $a->query->cookie(-name=>'sessionID', -value=>'blahblahblah', ); $a->header_props(-cookie => [$c1,$c2]); $a->run;
    C::A ought to give you a list of %ENV, one if which should be HTTP_COOKIE => 'userID=test123; sessionID=blahblahblah' in this case. Do you get that environment value okay, even when the cookies don't come through?

    Anyway, I'm thinking maybe a version issue somewhere along the line.

    Update: Below is the output from an HTTP session using the above code under mod_perl:

    [admin@bart][~]$ telnet localhost 80 Trying 127.0.0.1... Connected to localhost (127.0.0.1). Escape character is '^]'. get /perl/test3.cgi HTTP/1.0 HTTP/1.1 200 OK Date: Sun, 28 Jul 2002 05:08:17 GMT Server: Apache/1.3.12 (Unix) (Red Hat/Linux) PHP/3.0.15 mod_perl/1.26 Set-Cookie: userID=test123; path=/ Set-Cookie: sessionID=blahblahblah; path=/ Connection: close Content-Type: text/html; charset=ISO-8859-1 <P> Query Parameters:<BR> <OL> </OL> <P> Query Environment:<BR> <OL> <LI> DOCUMENT_ROOT => '<B>/home/httpd/html</B>' <LI> GATEWAY_INTERFACE => '<B>CGI-Perl/1.1</B>' <LI> MOD_PERL => '<B>mod_perl/1.26</B>' <LI> PATH => '<B>/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin</B>' <LI> QUERY_STRING => '<B></B>' <LI> REMOTE_ADDR => '<B>127.0.0.1</B>' <LI> REMOTE_PORT => '<B>1357</B>' <LI> REQUEST_METHOD => '<B>get</B>' <LI> REQUEST_URI => '<B>/perl/test3.cgi</B>' <LI> SCRIPT_FILENAME => '<B>/home/httpd/perl/test3.cgi</B>' <LI> SCRIPT_NAME => '<B>/perl/test3.cgi</B>' <LI> SERVER_ADDR => '<B>127.0.0.1</B>' <LI> SERVER_ADMIN => '<B>webmaster@lithocraft.com</B>' <LI> SERVER_NAME => '<B>bart.lithocraft.com</B>' <LI> SERVER_PORT => '<B>80</B>' <LI> SERVER_PROTOCOL => '<B>HTTP/1.0</B>' <LI> SERVER_SIGNATURE => '<B><ADDRESS>Apache/1.3.12 Server at bart.lit +hocraft.com Port 80</ADDRESS> </B>' <LI> SERVER_SOFTWARE => '<B>Apache/1.3.12 (Unix) (Red Hat/Linux) PHP/ +3.0.15 mod_perl/1.26</B>' <LI> UNIQUE_ID => '<B>PUN8Qc9c3QYAAC5MELk</B>' </OL> Connection closed by foreign host.

    cheers!

      Hmmm this doesn't look good, here's my output

      HTTP/1.1 200 OK
      Date: Sun, 28 Jul 2002 05:17:56 GMT
      Server: Apache-AdvancedExtranetServer/1.3.23 (Mandrake Linux/4mdk) mod_ssl/2.8.7 OpenSSL/0.9.6c PHP/4.1.2
      Content-Type: text/html; charset=ISO-8859-1
      Set-Cookie: sessionID=blahblahblah; path=/
      X-Cache: MISS from quigon.nomis52.com
      Transfer-Encoding: chunked
      
      

      If you reload it to see the cookies naturally only the last one is set

      <li> HTTP_COOKIE => '<b>sessionID=blahblahblah</b>'
      

      I tend to agree with you that this is an issue with my set-up, currently:

      • Apache 1.3.23
      • mod_perl 1.26
      • CGI 2.79
      • CGI::Application 2.4

      I'm going to give it a go on a debian box and see if thats any different.

        It works as expected on my Win2k, running ActivePerl 5.6.1
        Apache/1.3.24 and Apache/2.0.36 
        CGI::Application 2.4
        CGI 2.752
        
        My mod perl versions aren't relevant, since I didn't run this under mod perl (and it makes no difference).

        I would suggest you check your CGI module by attempting to use it's header method. If that doesn't produce the correct headers, then your CGI is to blame, and you should get a newer one (like 2.8).

        If it produces the correct headers, then something is wrong with your CGI::Application, and you should reinstall or upgrade it.

        If that doesn't help, well, then you have ghosts in your machine ( not good )

        ____________________________________________________
        ** The Third rule of perl club is a statement of fact: pod is sexy.

        I think this is a bug with mod_proxy, which affects apache 1.3.23 and 1.3.24. I had the same problem on my Mandrake box, and upgrading to 1.3.26 (from Cooker) solved the problem.

        See here for a discussion on this.

        -yogivan

      Well, I've tried it on a debian box and it works fine as expected. For what its worth:

      • Apache 1.3.26
      • mod_perl 1.26
      • CGI 2.752
      • CGI::Application 2.1

      Thanks for everyone's help

      Nomis52