Exemple : en-têtes Last-Modified dans les scripts

Ce script CGI Perl indique comment utiliser l'en-tête Last-Modified dans les scripts à des fins de démonstration.

#!/usr/bin/perl

use strict;
use warnings;
use CGI;
use CGI::Util;
use Date::Parse;

my $q = new CGI;

my $last_mod = $ENV{HTTP_IF_MODIFIED_SINCE};
if (defined $last_mod)
{
        $last_mod = str2time($last_mod);
        if (time() - $last_mod < 60)
        {
                print $q->header(-status=>304);
                exit 0;
        }
}

print $q->header(-type => "text/html", -status => 200,
        -last_modified => CGI::Util::expires("now"));

print "<html><body>\n<h1>Last-Modified Test</h1>\n" .
        "<p>Date: ".scalar localtime()."</p>\n" .
        "<table>\n";

foreach my $var (sort keys %ENV)
{
        next unless $var =~ /^HTTP_/;
        print "<tr><td>$var</td><td>$ENV{$var}</td></tr>\n";
}
print "</table></body></html>\n";

exit 0;                        

Le script commence par vérifier si un en-tête HTTP If-Modified-Since a été envoyé par le navigateur. Si un tel en-tête a été envoyé et si sa date associée entre dans le cadre des 60 dernières secondes, le script envoie une réponse 304 Not Modified.

Dans le cas contraire, le script envoie une réponse contenant l'en-tête Last-Modified défini sur l'heure en cours, laquelle sera réutilisée par le navigateur lors des prochaines requêtes (avec l'en-tête If-Modified-Since).

Lorsque vous chargez le script sur un serveur Web CGI, une réponse similaire à celle-ci s'affiche :

Last-Modified Test

Date: Fri Aug 3 17:02:08 2007

HTTP_ACCEPT text/xml,application/xml,application/xhtml+xml,...
HTTP_ACCEPT_CHARSET ISO-8859-1,utf-8;q=0.7,*;q=0.7
HTTP_ACCEPT_ENCODING gzip,deflate
HTTP_ACCEPT_LANGUAGE en-us,en;q=0.5
HTTP_CONNECTION keep-alive
HTTP_COOKIE 200
HTTP_HOST localhost
HTTP_IF_MODIFIED_SINCE Wed, 01 Aug 2007 15:59:49 GMT
HTTP_KEEP_ALIVE 300
HTTP_USER_AGENT Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.5) Gecko/20060601 Firefox/2.0.0.5 (Ubuntu-edgy)

Si vous rechargez la page en moins de 60 secondes, le serveur n'envoie aucune réponse, aucune nouvelle page n'est générée et la même page reste affichée. Cela est reflété par le fait que les en-têtes Date et HTTP_IF_MODIFIED_SINCE ne changent pas lorsque vous rechargez la page.

Une minute plus tard, la page expire dans le cache. La prochaine requête entraîne ensuite le rechargement de la page et la définition d'une nouvelle date d'expiration dans le cache.