discourse-legacysite-perl/site/glist/lib/GT/CGI/Cookie.pm
2024-06-17 21:49:12 +10:00

102 lines
2.8 KiB
Perl

# ==================================================================
# Gossamer Threads Module Library - http://gossamer-threads.com/
#
# GT::CGI::Cookie
# CVS Info :
# $Id: Cookie.pm,v 1.5 2004/08/19 23:49:30 jagerman Exp $
#
# Copyright (c) 2004 Gossamer Threads Inc. All Rights Reserved.
# ==================================================================
#
# Description:
# Handles cookie creation and formatting
#
package GT::CGI::Cookie;
#================================================================================
use strict;
use GT::CGI;
use GT::Base;
use vars qw/@ISA $ATTRIBS @MON @WDAY/;
@ISA = qw/GT::Base/;
$ATTRIBS = {
-name => '',
-value => '',
-expires => '',
-path => '',
-domain => '',
-secure => ''
};
@MON = qw/Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec/;
@WDAY = qw/Sun Mon Tue Wed Thu Fri Sat/;
sub cookie_header {
#--------------------------------------------------------------------------------
# Returns a cookie header.
#
my $self = shift;
# make sure we have a name to use
$self->{-name} or return;
my $name = GT::CGI::escape($self->{-name});
my $value = GT::CGI::escape($self->{-value});
# build the header that creates the cookie
my $header = "Set-Cookie: $name=$value";
$self->{-expires} and $header .= "; expires=" . $self->format_date('-', $self->{-expires});
$self->{-path} and $header .= "; path=$self->{-path}";
$self->{-domain} and $header .= "; domain=$self->{-domain}";
$self->{-secure} and $header .= "; secure";
return "$header";
}
sub format_date {
# -------------------------------------------------------------------
# Returns a string in http_gmt format, but accepts one in unknown format.
# Wed, 23 Aug 2000 21:20:14 GMT
#
my ($self, $sep, $datestr) = @_;
my $unix_time = defined $datestr ? $self->expire_calc($datestr) : time;
my ($sec, $min, $hour, $mday, $mon, $year, $wday) = gmtime($unix_time);
$year += 1900;
return sprintf(
"%s, %02d$sep%s$sep%04d %02d:%02d:%02d GMT",
$WDAY[$wday], $mday, $MON[$mon], $year, $hour, $min, $sec
);
}
*_format_date = \&format_date; # deprecated
sub expire_calc {
# -------------------------------------------------------------------
# Calculates when a date based on +- times. See CGI.pm for more info.
#
my ($self, $time) = @_;
my %mult = (s => 1, m => 60, h => 3600, d => 86400, M => 2592000, y => 31536000);
my $offset;
if (!$time or lc $time eq 'now') {
$offset = 0;
}
elsif ($time =~ /^\d/) {
return $time;
}
elsif ($time=~/^([+-]?(?:\d+(?:\.\d*)?|\.\d+))([smhdMy]?)/) {
$offset = $1 * ($mult{$2} || 1);
}
else {
return $time;
}
return time + $offset;
}
*_expire_calc = \&expire_calc; # deprecated
1;