2010-10-24 11 views
14

He usado Perl un poco para aplicaciones pequeñas y código de prueba, pero soy nuevo en redes y CGI.¿Cómo accedo al encabezado HTTP de la solicitud en un script CGI?

Obtuve cómo hacer el encabezado de una solicitud (usando CGI.pm e imprimiendo los resultados de la función de encabezado()), pero no he podido encontrar información sobre cómo acceder a los encabezados que se envían a mi script CGI ¿Podría alguien señalarme en la dirección correcta?

Esto podría ser de una petición como esta:

curl http://127.0.0.1:80/cgi-bin/headers.cgi -H "HeaderAttribute: value"

Respuesta

1

Están suministran como variables de entorno, tales como

HTTP_HEADERATTRIBUTE=value 

Es posible que tenga que hacer algo para configurar su servidor web para suministrar tal variable, sin embargo.

26

El módulo CGI tiene una función http() puede utilizar para este propósito:

#!/usr/bin/perl -- 
use strict; 
use warnings; 
use CGI; 

my $q = CGI->new; 
my %headers = map { $_ => $q->http($_) } $q->http(); 

print $q->header('text/plain'); 
print "Got the following headers:\n"; 
for my $header (keys %headers) { 
    print "$header: $headers{$header}\n"; 
} 

Inténtelo hacia fuera; lo anterior me da:

$ curl http://localhost/test.cgi -H "HeaderAttribute: value" 
Got the following headers: 
HTTP_HEADERATTRIBUTE: value 
HTTP_ACCEPT: */* 
HTTP_HOST: localhost 
HTTP_USER_AGENT: curl/7.21.0 (i686-pc-linux-gnu) libcurl/7.21.0 OpenSSL/0.9.8o zlib/1.2.3.4 libidn/1.18 
+0

Excelente ejemplo simple, exactamente lo que estaba esperando. ¡Gracias! – CGInewb

+0

¿Responde a tu pregunta, entonces? – mfontani

+2

¿Alguna manera de imprimir los nombres de encabezado literales? es decir, 'x-some-header' en lugar de' HTTP_X_SOME_HEADER'? –

5

Además del método CGI.pmhttp() puede obtener información de las cabeceras HTTP de las variables de entorno.

Entonces, en caso de que esté utilizando algo como CGI::Minimal, que no tiene el método http. puede hacer algo como:

my $header = 'HTTP_X_REQUESTED_WITH'; 

    if (exists $ENV{$header} && lc $ENV{$header} eq 'xmlhttprequest') { 
    _do_some_ajaxian_stuff(); 
    } 
Cuestiones relacionadas