2010-10-24 3 views
14

Ho usato Perl un po 'per le piccole applicazioni e il codice di test, ma sono nuovo di networking e CGI.Come accedere all'intestazione HTTP della richiesta in uno script CGI?

Ottengo come creare l'intestazione di una richiesta (utilizzando CGI.pm e stampando i risultati della funzione header()), ma non sono riuscito a trovare alcuna informazione su come accedere alle intestazioni inviate a il mio script in CGI. Potrebbe qualcuno indicarmi la giusta direzione?

Questo potrebbe essere da una richiesta del genere:

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

risposta

1

Sono forniti come variabili d'ambiente, come ad esempio

HTTP_HEADERATTRIBUTE=value 

Potrebbe essere necessario fare qualcosa per configurare il server web per fornire una tale variabile, però.

26

Il modulo CGI ha una funzione http() è possibile utilizzare per questo scopo:

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

Provalo; Quanto sopra mi dà:

$ 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

Eccellente esempio semplice, esattamente quello che speravo. Grazie! – CGInewb

+0

Risponde alla tua domanda, allora? – mfontani

+2

Un modo per stampare i nomi delle intestazioni testuali? Ad esempio 'x-some-header' invece di' HTTP_X_SOME_HEADER'? –

5

Oltre al metodo CGI.pmhttp() è possibile ottenere le intestazioni HTTP informazioni dalle variabili d'ambiente.

Quindi nel caso in cui si utilizza qualcosa come CGI::Minimal, che non ha il metodo http. puoi fare qualcosa del tipo:

my $header = 'HTTP_X_REQUESTED_WITH'; 

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