# Read all CGI vars into an associative array. # If multiple input fields have the same name, they are concatenated into # one array element and delimited with the \0 character (which fails if # the input has any \0 characters, very unlikely but conceivably possible). # Currently only supports Content-Type of application/x-www-form-urlencoded. |
sub getcgivars
{
local($in, %in);
local($name, $value);
|
# First, read entire string of CGI vars into $in
if ( ($ENV{'REQUEST_METHOD'} eq 'GET') || ($ENV{'REQUEST_METHOD'} eq 'HEAD') )
{
$in = $ENV{'QUERY_STRING'};
}
elsif ($ENV{'REQUEST_METHOD'} eq 'POST')
{
if ($ENV{'CONTENT_TYPE'}=~ m#^application/x-www-form-urlencoded$#i)
{
length($ENV{'CONTENT_LENGTH'})
|| &HTMLdie("No Content-Length sent with the POST request.");
read(STDIN, $in, $ENV{'CONTENT_LENGTH'});
}
else {&HTMLdie("Unsupported Content-Type: $ENV{'CONTENT_TYPE'}");}
}
else {&HTMLdie("Script was called with unsupported REQUEST_METHOD.");}
|
# Resolve and unencode name/value pairs into %in
foreach (split('&', $in))
{
s/\+/ /g;
($name, $value)= split('=', $_, 2);
$name=~ s/%(..)/chr(hex($1))/ge;
$value=~ s/%(..)/chr(hex($1))/ge;
$in{$name}.= "\0" if defined($in{$name}); # concatenate multiple vars
$in{$name}.= $value;
}
|
return %in; } |
# Die, outputting HTML error page
# If no $title, use a default title
sub HTMLdie
{
local($msg,$title)= @_;
$title || ($title= "CGI Error");
print <<EOF;
Content-type: text/html
<html>
<head>
<title>$title</title>
</head>
<body>
<h1>$title</h1>
<h3>$msg</h3>
</body>
</html>
EOF
exit;
}
|