How do I access the HTTP Header of request in a CGI script?

32,109

Solution 1

The CGI module has a http() function you can use to that purpose:

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

Try it out; the above gives me:

$ 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

Solution 2

In addition to the CGI.pm http() method you can get HTTP headers information from the environment variables.

So in case you are using something like CGI::Minimal, which doesn't have the http method. you can do something like:

  my $header = 'HTTP_X_REQUESTED_WITH';

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

Solution 3

They're supplied as environment variables, such as

HTTP_HEADERATTRIBUTE=value

You may have to do something to configure your web server to supply such a variable, though.

Share:
32,109
CGInewb
Author by

CGInewb

Updated on July 09, 2022

Comments

  • CGInewb
    CGInewb almost 2 years

    I've used Perl a bit for small applications and test code, but I'm new to networking and CGI.

    I get how to make the header of a request (using CGI.pm and printing the results of the header() function), but haven't been able to find any info on how to access the headers being sent to my CGI script. Could someone point me in the right direction?

    This could be from a request like this:

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

  • CGInewb
    CGInewb over 13 years
    Excellent simple example, exactly what I was hoping for. Thanks!
  • mfontani
    mfontani over 13 years
    Does it answer your question, then?
  • André Fernandes
    André Fernandes over 10 years
    Any way to print the verbatim header names? i.e. x-some-header instead of HTTP_X_SOME_HEADER ?
  • NeoJi
    NeoJi almost 8 years
    This does not show any custom headers or any content information like meta data of attached files.