# Ler todas as variaveis CGI para dentro de um array associativo. # Se multiplos campos de entrada tiverem o mesmo nome, serao concatenados em # um elemento do array e delimitados com o caractere \0 (isso falha se # a entrada contiver algum caractere \0, muito improvavel mas # conceitualmente possivel). # Atualmente suporta apenas Content-Type de application/x-www-form-urlencoded. sub getcgivars { local($in, %in) ; local($name, $value) ; # Primeiro, ler a cadeia inteira de variaveis CGI e armazenar em $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.") ; } # Resolver e decodificar pares nome/valor em %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}) ; # concatenar multiplas vars $in{$name}.= $value ; } return %in ; } # Morrer, colocando na saida a pagina de erro HTML # Se nao houver $title, usar um titulo default sub HTMLdie { local($msg,$title)= @_ ; $title || ($title= "CGI Error") ; print < $title

$title

$msg

EOF exit ; }