Defindit Docs and Howto Home

This page last modified: Jun 06 2007
title:HTTP header examples
description:Examples of content headers for web pages and downloads

Table of contents
Simple HTTP header
Download header Content-Disposition

Simple HTTP header

The simple http head that tells a web browser to expect a web page is

Content-Type: text/html;

It must be followed by two newlines (Linux \n\n, Windows is carriage
return and linefeed I think, Mac is something else - maybe carriage

I like to explicitly include the charset I'm using. Many web pages
forget this an then use special characters which don't render properly
in the web browser because the charset is not defined and the browser
chooses a default. If my HTML is in a string $output, this would be a
typical line of Perl:

   print "Content-Type: text/html; charset=iso-8859-1\n\n$output";

You must sent HTML output the web server (Apache) will get upset.  You
get an error if the outgoing text doesn't look like HTML. Apache will
return a 500 error if the output isn't HTML. The HTML can be as simple
as "<html><body><pre>text content here</pre></body></html>";

Sometimes it is handy to just spew text to the browser. Firefox is
fine with this, but some versions of IE have to call an external
application (such as Notepad) to read plain text.

   print "Content-Type: text/plain; \n\n";
   print "Hello world.\n";

If you print plain text without the proper header, you'll get a 500
error from the server. If you have text that looks like http headers
(name:value) then you might not get a 500 error, even though the
header is improperly formed.

foo: bar

In this case you might be able to print and get some of your output in
the browser without an error, although the results are unpredictable.

Download header Content-Disposition

Perl code:

    my $fn = "file_name.txt";
    my $size = length($output_string);

    # Tested and works in IE 6 and Firefox 1.5
    # The file name, file type, and size are correct.
    # The line endings are probably wrong for Windows.

    print "Content-Length: $size\n";
    print "Content-Type: text/plain;\n";
    print "Content-Disposition: attachment; filename=$fn\n";
    print "\n"; # Don't forget the second newline to end the http header.

    print "$output_string";

It is important *not* to have a semicolon (;) at the end of the size
parameter with Content-Length. If the size integer has a terminating ;
then Firefox will ignore it. I did not try a size followed by a space
followed by a semicolon.

The size parameter for Content-Disposition seems not to be
supported. In other words, the following is wrong and does not work:

    print "Content-Disposition: attachment; filename=$fn; size=$size\n";

The semicolon after filename seem optional. The filename may be
enclosed in double quotes (which in Perl have to be escaped to protect
them, and you could use a single-quoted string, but then the variables
wouldn't interpolate). 

In one test instance, this worked:	 

    print "Content-Disposition: attachment; filename=\"$fn\"\n";


Note the final print newline after the header lines have been
printed. The http head is terminted by two consecutive newlines, thus
each header line has a newline, and we print a final newline for the
double newline termination.

I debug by commenting things out, and trial and error. As far as I
know, http headers are not case sensitive. However, they are sensitive
to spelling, and some versions of some browsers (IE especially, but
also Opera) actually expect incorrectly spelled parameters (or so the
www says).

The semicolon after parameters on multiparameter lines is required.

You can view the output of your script with something like wget -S or
curl (not sure what command line arg with curl). You want a utility
that will show you the http headers (server headers) in addition to
getting the page or downloading the file. I'm not sure what to use
under Windows (the Web Developer extension for Firefox will display
response headers). OSX can use curl from the Terminal command line.