2010-10-24 18 views
14

J'ai utilisé un peu Perl pour les petites applications et le code de test, mais je suis nouveau dans le domaine du réseau et du CGI.Comment accéder à l'en-tête HTTP de la requête dans un script CGI?

Je comprends comment faire l'en-tête d'une requête (en utilisant CGI.pm et en imprimant les résultats de la fonction header()), mais je n'ai trouvé aucune information sur la façon d'accéder aux en-têtes envoyés mon script CGI. Quelqu'un peut-il m'indiquer la bonne direction?

Cela pourrait provenir d'une telle demande:

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

Répondre

1

Ils sont fournis sous forme de variables d'environnement, telles que

HTTP_HEADERATTRIBUTE=value 

Vous devrez peut-être faire quelque chose pour configurer votre serveur web pour fournir une telle variable, cependant.

26

Le module CGI a une fonction http() vous pouvez utiliser à cette fin:

#!/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"; 
} 

Essayez-; ce qui précède me donne:

$ 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

Excellent exemple simple, exactement ce que j'espérais. Merci! – CGInewb

+0

Est-ce que cela répond à votre question? – mfontani

+2

Un moyen d'imprimer les noms d'en-tête verbatim? c'est-à-dire 'x-some-header' au lieu de' HTTP_X_SOME_HEADER'? –

5

En plus de la méthode CGI.pmhttp() vous pouvez obtenir les en-têtes HTTP des informations à partir des variables d'environnement. Donc, dans le cas où vous utilisez quelque chose comme CGI::Minimal, qui n'a pas la méthode http. vous pouvez faire quelque chose comme:

my $header = 'HTTP_X_REQUESTED_WITH'; 

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