Decoding HTML requests:
($command, $request, $method) = split(" ",$command); ($document, $request) = split("\\\?",$request); for (split("&",$request) ) { s/\+/ /g; ($key, $val) = split("=",$_); $key =~ s/%(..)/pack("c",hex($1))/ge; $val =~ s/%(..)/pack("c",hex($1))/ge; $query{$key} = $val;
sub escapeHTML { my ($self,$toencode,$newlinestoo) = CGI::self_or_default(@_); return undef unless defined($toencode); return $toencode if ref($self) && $self->{'dontescape'}; $toencode =~ s{&}{&}gso; $toencode =~ s{<}{<}gso; $toencode =~ s{>}{>}gso; $toencode =~ s{"}{"}gso; my $latin = uc $self->{'.charset'} eq 'ISO-8859-1' || uc $self->{'.charset'} eq 'WINDOWS-1252'; if ($latin) { # bug in some browsers $toencode =~ s{'}{'}gso; $toencode =~ s{\x8b}{‹}gso; $toencode =~ s{\x9b}{›}gso; if (defined $newlinestoo && $newlinestoo) { $toencode =~ s{\012}{ }gso; $toencode =~ s{\015}{ }gso; } } return $toencode; } sub unescapeHTML { my ($self,$string) = CGI::self_or_default(@_); return undef unless defined($string); my $latin = defined $self->{'.charset'} ? $self->{'.charset'} =~ /^(ISO-8859-1|WINDOWS-1252)$/i : 1; # thanks to Randal Schwartz for the correct solution to this one $string=~ s[&(.*?);]{ local $_ = $1; /^amp$/i ? "&" : /^quot$/i ? '"' : /^gt$/i ? ">" : /^lt$/i ? "<" : /^#(\d+)$/ && $latin ? chr($1) : /^#x([0-9a-f]+)$/i && $latin ? chr(hex($1)) : $_ }gex; return $string; }
Encodeing CGI Environment Variables for handoff to a CGI program
$ENV{SERVER_SOFTWARE} = 'MyHTTPd/0.1'; $ENV{SERVER_NAME} = Sys::Hostname::hostname(); $ENV{GATEWAY_INTERFACE} = 'CGI/1.1'; $ENV{SERVER_PROTOCOL} = $protocol; $ENV{SERVER_PORT} = $PORT; $ENV{REQUEST_METHOD} = $method; $ENV{QUERY_STRING} = $querydata; $ENV{REMOTE_ADDR} = $client->peerhost; $ENV{HTTP_ACCEPT} = $request{'Accept'}; $ENV{HTTP_USER_AGENT} = $request{'User_Agent'}; $ENV{SCRIPT_NAME} = $request->url->epath; $ENV{CONTENT_LENGTH} = 0;
See also