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; }