Forum Webscript.Ru
Программирование => Perl => Тема начата: Inecs от 23 Марта 2006, 14:50:41
-
Пишем элементарный код:
my $sid="qwejqhwjkhqjkuausdhahd";
print "Set-Cookie: sid=$sid; expires=+7d;\\n";
print "Content-type: text/html\\n\\n";
Вопрос в том, а почему не хочет ставиться кука?
-
print "Set-Cookie: sid=$sid; expires=+7d;\\n";
а формат для expires???
+7d - это вы избалованы модулем CGI.
-
Дык ему точную дату удаления кукисов надо???
А какой формат, если не секрет?
-
rfc 2616
# perl -MCGI::Cookie -e \'print new CGI::Cookie(-name=>"ID",-value=>123456,-expires => "+3M")\'
ID=123456; path=/; expires=Wed, 21-Jun-2006 12:36:50 GMT
#
-
Так, взял скрипт из примера и немного его переделал:
sub place_cookie {
my ($income_sid) = @_;
#Количество секунд в 30-ти днях
my $d=2592000;
#Английские трехбуквенные обозначения
#дней недели и месяцев
my @weekdays=(\'Sun\',\'Mon\',\'Tue\',\'Wed\',\'Thu\',\'Fri\',\'Sat\');
my @months=(\'Jan\',\'Feb\',\'Mar\',\'Apr\',\'May\',\'Jun\',\'Jul\',\'Aug\',\'Sep\',\'Oct\',\'Nov\',\'Dec\');
my $t=time;
$t+=$d;
#Получаем значение конечных даты и времени в "обычном" виде
my ($SS,$MM,$HH,$DD,$MON,$YY,$WD);
($SS,$MM,$HH,$DD,$MON,$YY,$WD)=gmtime($t);
$YY=$YY+1900;
my $exp_date="$weekdays[$WD], $DD-$months[$MON]-$YY $HH:$MM:$SS GMT";
#Вставляем \'0\' перед числами <10, если они есть
my $z=\'0\';
$exp_date=~s/(\\D)(\\d{1})(\\D)/$1$z$2$3/g;
#my $cookie="sid=$income_sid\\; path=/\\; expires=$exp_date\\;";
my $cookie="sid=$income_sid\\; expires=$exp_date\\;";
print "Content-Type: text/html\\n";
print "Set-Cookie: $cookie\\n\\n";
}
И всё равно не работает...
Вызываю как:
place_cookie($sid);
Пробовал посмотреть через print. $income_sid и $exp_date выводяться отлично. Так почему не ставяться куки?
-
# perldoc -m CGI::Util | grep -B0 -A19 "^sub expires"
sub expires {
my($time,$format) = @_;
$format ||= \'http\';
my(@MON)=qw/Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec/;
my(@WDAY) = qw/Sun Mon Tue Wed Thu Fri Sat/;
# pass through preformatted dates for the sake of expire_calc()
$time = expire_calc($time);
return $time unless $time =~ /^\\d+$/;
# make HTTP/cookie date string from GMT\'ed time
# (cookies use \'-\' as date separator, HTTP uses \' \')
my($sc) = \' \';
$sc = \'-\' if $format eq "cookie";
my($sec,$min,$hour,$mday,$mon,$year,$wday) = gmtime($time);
$year += 1900;
return sprintf("%s, %02d$sc%s$sc%04d %02d:%02d:%02d GMT",
$WDAY[$wday],$mday,$MON[$mon],$year,$hour,$min,$sec);
}
-
А чем мой пример плох?
-
Тем что не работает.
А вообще для того чтобы нормально работать с форматом, нужно использовать две функции:
sub expires - о которой написал arto
и
sub expire_calc {
my($time) = @_;
my(%mult) = (\'s\'=>1,
\'m\'=>60,
\'h\'=>60*60,
\'d\'=>60*60*24,
\'M\'=>60*60*24*30,
\'y\'=>60*60*24*365);
# format for time can be in any of the forms...
# "now" -- expire immediately
# "+180s" -- in 180 seconds
# "+2m" -- in 2 minutes
# "+12h" -- in 12 hours
# "+1d" -- in 1 day
# "+3M" -- in 3 months
# "+2y" -- in 2 years
# "-3m" -- 3 minutes ago(!)
# If you don\'t supply one of these forms, we assume you are
# specifying the date yourself
my($offset);
if (!$time || (lc($time) eq \'now\')) {
$offset = 0;
} elsif ($time=~/^\\d+/) {
return $time;
} elsif ($time=~/^([+-]?(?:\\d+|\\d*\\.\\d*))([mhdMy]?)/) {
$offset = ($mult{$2} || 1)*$1;
} else {
return $time;
}
return (time+$offset);
}
которая вызывается из expires
и работать с ними так:
my $format=expires("+1d");
-
Тобишь, если я подставлю дату, которую возвращает expires в подпрограмму:
sub place_cookie {
my $exp_date = expires("+30d");
my $cookie="sid=$income_sid\\; expires=$exp_date\\;";
print "Content-Type: text/html\\n";
print "Set-Cookie: $cookie\\n\\n";
}
Кука поставиться... Во блин изврат :-)
Пошёл пробовать...
-
Yahoooo РАБОТАЕТ!!! :-)
Всем большое спасибо.
А обьясните мне, я так понимаю, моя подпрограмма составляла время в неправильном формате? Или из-за чего ошибка?
-
угу... время нужно в другом формате ставить...