CGI::Cookie expires time [SOLVED]

В общем, есть CGI скрипт, в нем устанавливаю кукис.
Кука ставится, т.к. вывод

use CGI::Cookie;
&auth::set_cookie($login, $session);
print $ENV{HTTP_COOKIE};

Quote:

Set-Cookie: admin=4e8a9aa0f706259cda20f2e3f2fc4168; path=/; expires=Sun, 21-Sep-2008 06:31:50 GMT

При этом системное время:

Quote:

$ date
Вск Сен 21 17:30:36 VLAST 2008

т.е. время истекает в прошлом ?
как пофиксить?))

Поправочка..

print $ENV{'HTTP_COOKIE'};
вообще ничего не выводит, а строчка:

Quote:

Set-Cookie: admin=4e8a9aa0f706259cda20f2e3f2fc4168; path=/; expires=Sun, 21-Sep-2008 06:31:50 GMT

выводится когда устанавливаю кукис:

sub set_cookie
{
	my $admin_login = shift;
	my $session = shift;
	my $cookie = cookie(-name=>$admin_login,
						-value=>$session
						-expires => '+1m',
						-path    =>  '/'
						);
	print "Set-Cookie: $cookie\n\n";
	return 1;
}

Раньше $ENV{'HTTP_COOKIE'}, выводило все.. Браузер Opera, включил принимать все cookie.
------------------

#!/usr/bin/perl
print("подпись!!1\n");

Если не делать

Если не делать -expires, тогда время показывает:

Quote:

path=/ Date: Sun, 21 Sep 2008 07:38:03 GMT Content-Type: text/html; charset=-8

следовательно время оно правильно выставляет (expires), только вот начальное время неправильно оно берет, это баг или я туплю гдето?)

------------------

#!/usr/bin/perl
print("подпись!!1\n");

Это можно

Это можно объяснить тем, что в теле функции set_cookie не хватает одной запятой.
После устранения ошибки все работает. А вот где именно ее не хватает уж потрудитесь найти.
 
И пожалйста, оформляйте в следующий раз код, который выкладываете на обозрение,
таким образом, чтобы его можно было не утруждаясь запустить.
Например

use CGI qw/:standard/;
use CGI::Cookie;
 
set_cookie($login, $session);
print $ENV{HTTP_COOKIE};
 
sub set_cookie{
# ...
}
было бы хороше
 
Уж простите мне колкость, но я потратил 20 минут на то чтобы вспомнить/прочитать что и куда нужно подгружать,
т.к. не использую в работе CGI...

Спасибо

Спасибо огромное за пример, обещаю впредь оформлять хорошо, чтобы было понятно =)

По теме, то проблема была видимо в том что после создания куки я делаю редирект на другую страницу:

my $cookie = cookie(-name=>$login,
                    -value=>$session,
                    -expires => '+1m'
                    ); 
print header(-charset=>utf-8, -cookie=>$cookie);          
 
print qq(<meta http-equiv="refresh" content="0;url=admin.cgi?sid=$session">);

Вот в таком случае кукис не сохраняется, почему-то.


#!/usr/bin/perl 
print("подпись!!1\n");

Не сталкивался

Не сталкивался проблемой куки/редирект - всегда все работало.
Возможно проблема заключается в пустых переменных $login, $session.
Пробуйте журналировать вывод header()

#!/usr/bin/perl
 
use CGI qw/:standard/;
use CGI::Cookie;
use strict;
 
my $cookie = cookie(-name=>'login',
                    -value=>'session id',
                    -expires => '+1m'
                    ); 
print header(-charset=>'utf-8', -cookie=>$cookie);
  
print '<meta http-equiv="refresh" content="0;url=/">';

В таком виде работает с хромом и фф

Quote: Возможно

Quote:
Возможно проблема заключается в пустых переменных $login, $session.

эти переменные не пустаные. просто у меня есть auth.pm в нем:

package auth;
use CGI qw/:standard/;
use CGI::Cookie;
 
 
sub set_cookie
{ 
    my ($login, $session_id) = @_;
    my $cookie = cookie(-name => $login,
                        -value => $session_id,
                        -expires => '+1m'
                        ); 
    print header(-charset=>'utf-8', -cookie=>$cookie);
    return 1;
}
# ...
1;

А из файла index.cgi я вызываю функцию так:

# ...
    my $login = param('login');
    my $passwd = param('password');
    &auth::set_cookie($login, $session);                       
    print qq(<meta http-equiv="refresh" content="0;url=admin.cgi?sid=$session">);
# ...

В таком случае кукисы не устанавливаются почему-то. Хотя другие функции из auth.pm выполняются..


#!/usr/bin/perl 
print("подпись!!1\n");

Как я гооврил

Как я гооврил выше, журналируйте рузельтат выполнения header()
Я проверил этлот пример, он работает, браузер кушает печенье.

Проблема в том,

Проблема в том, как оказалось, что в начале файла у меня.

print "Content-Type: text/html; charset=UTF-8;\n\n";

если закоментить, т.е. один раз в файле вызывать заголовок:

print header(-charset => 'utf-8', -cookie=>$cookie);

тогда оно будет ставить куки.

Как быть в таком случае ?

#!/usr/bin/perl 
print("подпись!!1\n");

Эээээ..... fu7ur3...

Эээээ..... fu7ur3... тут уж нужно выбирать что-то одно.
Либо ты отдаешь управление хидерами CGI.pm, либо возишься с ними сам.
последовательность "\n\n" обозначает конец хидеров и начало самого файла.
т.е. в приведеном случае весь хидер, который отдает CGI.pm (и печенюшки в том числе)
скорее всего интерпритируются как текст, просто не отображаются браузером.

Как бы то нибыло, проблемму нужно рассматривать глобально.
Для этого я бы порекомендовал либо перенаправить (журналирвать) _весь_ вывод на STDOUT
Либо воспользоватся wget --save-headers http://localhost/script.cgi

Для себя я предпочитаю последнее.
так намного проще выяснить, что же не нравится браузеру в предложенном блюде.

По стандарту

По стандарту HTTP,
"\n\n"
означает конец хидеров, естественно, все что идет далее, уже будет обрабатываться как контент.

Поэтому вообще стоит читать тексты стандартов, или полагаться _полностью_ на чужой код в готовых библиотеках.