23

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"

3 Answers 3

36

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
Sign up to request clarification or add additional context in comments.

4 Comments

Excellent simple example, exactly what I was hoping for. Thanks!
Does it answer your question, then?
Any way to print the verbatim header names? i.e. x-some-header instead of HTTP_X_SOME_HEADER ?
This does not show any custom headers or any content information like meta data of attached files.
7

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();
  }

Comments

1

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.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.