issue setting cookies

They have: 46 posts

Joined: May 2002

Hi,

I'm using a .cgi script written in Perl on a Linux/Apache server to set a cookie.

This is the first time I've ever played around with setting cookies, and I'm having some, but not complete success.

Here's one of my Set-Cookie statements:
$session_id = "4918b9fe1f73d715b494589fe0c38d28";
$action = "main";
print "Set-Cookie:ID=$session_id; action=$action; path=/; expires=Thu, 31-Dec-2003 00:00:00 GMT\n";

Here's the resulting cookie that gets saved to a temporary file on my computer:
ID
4918b9fe1f73d715b494589fe0c38d28
my.domain.com/
1536
143147008
29609777
2033440848
29543362
*

Note that in the above example, ID=$session_id successfully went into the cookie, but that action=$action did not get set in the cookie!!!

Just for kicks, I reversed the order of "ID" and "action" in the set cookie statement and the opposite thing happened: "action" got set and "ID" did not!! (see below)

print "Set-Cookie:action=$action; ID=$session_id; path=/; expires=Thu, 31-Dec-2003 00:00:00 GMT\n";

Here's the resulting cookie that gets saved to a temporary file on my computer:
action
main
my.domain.com/
1536
143147008
29609777
2718318144
29543361
*

In both cases, "path" and "expires" do get set.

Anybody seen anything like this before or have any ideas?

Thanks...

They have: 46 posts

Joined: May 2002

I think I solved my own problem.

I think I need a separate Set_Cookie statement for each key-value pair. I'm still testing but it looks like that's what it is. Duh.

print "Set-Cookie:ID=$session_id; path=/; expires=Thu, 31-Dec-2003 00:00:00 GMT\n";
print "Set-Cookie:action=$action; path=/; expires=Thu, 31-Dec-2003 00:00:00 GMT\n";

They have: 46 posts

Joined: May 2002

Nope - that's not working either... When I read the cookie, it's only grabbing the first of the 2 sets... I still need your help...

# GET COOKIE CRUMBS
my %crumbs = "";
if ($ENV{HTTP_COOKIE} ne "") {
my @cookies = split(/;/,$ENV{HTTP_COOKIE});
foreach my $cookie (@cookies) {
my ($name, $value) = split(/=/,$cookie);
$crumbs{$name} = $value;
} # end for
} # end if
&Error(" 1 $crumbs{ID} 2 $crumbs{action}");

Result:
1 9b9df633f4dbb23c5bca988167031ac4
2

They have: 601 posts

Joined: Nov 2001

OK. Start off. Please don't roll your own Cookie parser/set routine. Please consider using CGI.pm or any of the Cookie::, CGI::Cookie, modules on the CPAN.

Here's the relevent bit in the CGI.pm docs about cookies.

http://stein.cshl.org/WWW/software/CGI/#cookies

- wil

They have: 46 posts

Joined: May 2002

Thanks for the advice about using an existing module. I'm sure that's the best approach. Unfortunately I don't use CGI.pm and would prefer not to download and install any other modules.

Can anyone help me out with a do-it-yourself reinvent-the-wheel read-more-than-one-cookie code in Perl?

I can set multiple cookies. And my code (above) can successfully read the first one. But it's not reading in additional cookies after the first.

TIA.

They have: 601 posts

Joined: Nov 2001

CGI.pm comes with Perl. You don't need to download anything.

Reading cookies is an absolute walk in the park, too. Try something like:

my $cookie1 = $query->cookie('cookie1);
my $cookie2 = $query->cookie('cookie2');
...
'

Can't get any easier than that. Smiling

- wil

They have: 601 posts

Joined: Nov 2001

Let me give you a few more examples.

use CGI;
my $query = CGI->new();

sub set_cookie {

my $cookie = $query->cookie (          
   -name => 'mycookie',          
   -value => 'value',          
   -expires => '+1M',          
   -path => '/',          
   -domain => 'mydomain.com'     
);

print $query->header( -cookie=> $cookie );

}

sub retrieve_cookie {

my $cookie = $query->cookie('mycookie');

}
'

Hope that helps.

- wil

They have: 46 posts

Joined: May 2002

Thank you for the examples - I really appreciate them. I do recognize that CGI.pm is available to me and that it is supposed to make many tasks easier and more efficient, but I'm an old dog, and that's a new trick that I'm going to continue to resist using for a while - too many other things to learn...

I did, however, figure this out. The book I got the cookie parsing routine out of had a typo.

Here's the content of $ENV{HTTP_COOKIE}:
ID=16bed70d0bc216db0572bce1bf48dcb9; action=main

So I needed to add a space after the semicolon in my split statement...
---from---
my @cookies = split(/;/,$ENV{HTTP_COOKIE});
---to---
my @cookies = split(/; /,$ENV{HTTP_COOKIE});

I can now read multiple cookies. Thanks again for the help.

They have: 447 posts

Joined: Oct 1999

if you don't want to use cgi.pm search for "cookie-lib.pl" -- i used it along time ago but i don't recall having any problems. Even if you don't use it the code will help you with your own implementation.

They have: 601 posts

Joined: Nov 2001

cookie-lib has been replaced with CGI.pm as of Perl 5.x. Please resist using any of the *-lib modules, including cgi-lib.pl. They're outdated and insecure.

- wil

Want to join the discussion? Create an account or log in if you already have one. Joining is fast, free and painless! We’ll even whisk you back here when you’ve finished.