package cgis;
#
# cgiインタフェースパッケージ
#
#
use strict;
no strict 'refs';
require'jcode.pl';
sub enable_url($)
{
my $str=shift;
# $str =~ s/(?$1<\/A>/g;
$str;
}
sub _escape($)
{
my $str=shift;
$str =~ s/([\+\%\"\;\&\=])/'%'.unpack("H2",$1)/ge;
$str =~ tr/ /+/;
$str;
}
sub _unescape($)
{
my $str=shift;
$str =~ tr/+/ /;
$str =~ s/%([A-Fa-f0-9][A-Fa-f0-9])/pack("C", hex($1))/eg;
$str;
}
sub _expiration($)
{
my $days=shift;
my @month=("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec");
my @week =("Sun","Mon","Tue","Wed","Thu","Fri","Sat");
my ($sec,$min,$hour,$day,$mon,$year,$wday)= gmtime(time+$days*24*60*60);
return sprintf("%s, %d-%s-%d %02d:%02d:%02d GMT",
$week[$wday],$day,$month[$mon],$year+1900,$hour,$min,$sec);
}
#-----------------------------------------------
# form I/O
# クッキー、ともエスケープ対象は[ "+;&=]
# 渡された変数リストからフィールドを生成して文字列を返す
sub set_param(@)
{
my @list=@_;
return "" unless @list;
my $field="";
my ($val,$key,$eval,$ekey);
foreach $val (@list) {
$eval=_escape $$val;
$ekey=_escape $val;
$field .= qq/\n/;
}
$field;
}
# フィールドの値を変数リストの変数に値を代入,リストにないものは無視
sub get_param(@)
{
my @list=@_;
return 0 unless @list;
my $paramstr;
if( lc $ENV{REQUEST_METHOD} eq 'post')
{
read(STDIN,$paramstr,$ENV{CONTENT_LENGTH});
}else {
$paramstr=$ENV{QUERY_STRING};
}
my %params;
my (@pairs)= split(/&/,$paramstr);
foreach (@pairs) {
my($key,$val)=split("=");
$params{_unescape $key}=jcode::euc(_unescape $val);
}
foreach my $val (@list) {
$$val=$params{$val} if $params{$val};
}
return 1;
}
#-----------------------------------------------
# cookie I/O
# クッキー、ともエスケープ対象は[ "+;&=]
# 連想配列からクッキー文字列を生成して返す
sub set_cookie($$$)
{
my($name,$expires,$hashref)=@_;
return unless %{$hashref};
my ($key,$val,$ekey,$eval);
my $field="$name=";
while( ($key,$val)= each(%{$hashref})) {
$ekey=_escape $key;
$eval=_escape $val;
$field .="$ekey:$eval&";
}
$field =~ s/&$//g;
$field ."; expires=". _expiration($expires).";";
}
# クッキー環境変数から連想配列を生成して返す
sub get_cookie($)
{
my $name=shift;
my $cookie=$ENV{"HTTP_COOKIE"} || $ENV{"COOKIE"};
return () unless $cookie;
return () unless $cookie =~ /$name=([^;]+)/;
my $mycookie=$1;
my ($key,$val,%hash);
while($mycookie =~ /([^:&]+):([^:&]+)/g){
$key=_unescape $1;
$val=jcode::euc(_unescape $2);
$hash{$key}=$val;
}
return %hash;
}