POST és GET paraméterek dekódolása

Mint azt az előző fejezetben láthattuk a cgi paramétereket a böngésző kódolja. Hogyan lehet ezek után valami értelmes formára hozni ezeket?

Nos Perl nyelven ez nem túlzottan bonyolult. A legprimitívebb válasz az az, hogy használni kell például a cgi-lib.pl vagy CGI.pm modulokat, amelyek ezt elvégzik. De azért nézzük meg, hogy hogyan is történik ez az egész. Öt sorban el lehet intézni az egészet. (Hogy akkor miért 140KB a CGI.pm forrása?)

A pédaprogram:

#!/local/bin/perl
require 'state.pl';
sub cgi_convert {
  my $p = shift;
  $p =~ tr/+/ /; #minden + jelet szóközre cserél
  $p =~ s/%([0-9a-f]{2})/pack("c",hex($1))/ige; # hexa kódokat vissza
  return $p;
}

$get_parameter = $ENV{'QUERY_STRING'};
@get_parameters = split('&',$get_parameter);
for( @get_parameters ){
  ($p,$v) = split('=');
  $p = cgi_convert $p;
  $v = cgi_convert $v;
  $GET{$p} = $v;
}

read STDIN, $post_parameter,$ENV{'CONTENT_LENGTH'};
@post_parameters = split('&',$post_parameter);
for( @post_parameters ){
  ($p,$v) = split('=');
  $p = cgi_convert $p;
  $v = cgi_convert $v;
  $POST{$p} = $v;
}

$get_parameter = '';
while( ($p,$v) = each %GET ){
  $get_parameter .= "<tr><td><b>$p</b></td><td>$v</td></tr>\n";
}
$post_parameter = '';
while( ($p,$v) = each %POST ){
  $post_parameter .= "<tr><td><b>$p</b></td><td>$v</td></tr>\n";
}

print_http_state('200 OK');
print <<END;
Content-type: text/html

<HTML>
<BODY>
<h1>GET és POST paraméterek</h1>
<HR>
GET paraméter:<BR>
<table border=1>
$get_parameter
</table>
<HR>
POST paraméter:<BR>
<table border=1>
$post_parameter
</table>
</BODY>
</HTML>
END

amit a
<form method=POST action="http://www.emma.hu/cgitutorial/shwparlist.pl?birka=nem+mad%F3r">
<input type=hidden name=kakukk value="az egy madár">
<input type=hidden name=szarka value="ez is madár?">
<input type=submit value="Ezt kell megnyomni!">
</form>
html kódból hívunk meg. Az eredmény pedig:

GET és POST paraméterek


GET paraméter:
birkanem madór

POST paraméter:
kakukkaz egy madár
szarkaez is madár?

A program lényege a cgi_convert rutin, amely a paramétereket dekódolja, miután a program azokat feldarabolta. Hogy ez nem öt sor? De igen, igazi Perl-ben:
{my($p,$v); my @p; my $u = 
sub { $_[0] =~ tr/+/ /; $_[0] =~ s/%([0-9a-f]{2})/pack("c",hex($1))/ige; $_[0]; };
read STDIN, $p,$ENV{'CONTENT_LENGTH'}; @p = split('&',$p);
push @p, split('&',$ENV{'QUERY_STRING'});
for(@p) { ($p,$v) = split('='); $p = &$u($p); $v = &$u($v); ${$::{$p}} = $v; }}
Ez az ötsoros kis programdarab fogja a POST és GET paramétereket, dekódolja, és a main névterületre elhelyezi a változókat. Ha tehát van például egy URL:
http://myserver.mydomain.mycom:21/kakukk.pl?foo=bar

akkor a programdarab lefutása után lesz egy $foo nevű Perl változónk, amelynek az értéke bar. Nem törődik azokkal a paraméterekkel, amelyek több példányban is szerepelnek, és ha egy GET paraméternek ugyanaz a neve, mint egy POST paraméteréé, akkor azt a változót felülírja.

Verhás Péter Home Page . . . . . . CGI röviden, tartalomjegyzék