]> git.deb.at Git - deb/packages.git/blobdiff - lib/Packages/Dispatcher.pm
fix off-by-one after switching on the brain again
[deb/packages.git] / lib / Packages / Dispatcher.pm
index 9f844f2e2d175240e4d5eb06887b59a6f08e1c4e..c247be94d3a4fb1685d42b21849b82a038cdf2e6 100755 (executable)
@@ -30,6 +30,7 @@ use DB_File;
 use URI::Escape;
 use Benchmark ':hireswallclock';
 use I18N::AcceptLanguage;
+use Date::Parse;
 
 use Deb::Versions;
 use Packages::Config qw( $DBDIR $ROOT $TEMPLATEDIR $CACHEDIR
@@ -63,12 +64,12 @@ sub do_dispatch {
     delete $ENV{'LC_ALL'};
     delete $ENV{'LC_MESSAGES'};
 
-    my %SUITES_ALIAS = ( oldstable => 'sarge',
-                        stable => 'etch',
-                        testing => 'lenny',
+    my %SUITES_ALIAS = ( oldstable => 'etch',
+                        stable => 'lenny',
+                        testing => 'squeeze',
                         unstable => 'sid',
-                        '3.1' => 'sarge',
-                        '4.0' => 'etch' );
+                        '4.0' => 'etch',
+                        '5.0' => 'lenny' );
 
     # Read in all the variables set by the form
     my $input;
@@ -91,6 +92,22 @@ sub do_dispatch {
     my $homedir = dirname($ENV{SCRIPT_FILENAME}).'/../';
     &Packages::Config::init( $homedir );
     &Packages::DB::init();
+    my $last_modified = $Packages::DB::db_read_time;
+    my $now = time;
+    my $expires = $last_modified + (12*3600);
+    $expires = $now + 3600 if $expires < $now;
+    # allow some fudge, since the db mod time is not the end of
+    # the cron job
+    $last_modified = $now if $now - $last_modified < 3600;
+
+    if ($input->http('If-Modified-Since') and
+       (my $client_timestamp = str2time($input->http('If-Modified-Since'), 'UTC'))) {
+       if ($client_timestamp >= $last_modified) {
+           # we are not modified since asked -> return "304 Not Modified"
+           print $input->header(-status => 304);
+           exit;
+       }
+    }
 
     my %PO_LANGUAGES = map { $_ => 1 } @LANGUAGES;
     my %DDTP_LANGUAGES = map { $_ => 1 } @DDTP_LANGUAGES;
@@ -161,7 +178,11 @@ sub do_dispatch {
        } elsif (@components == 0) {
            fatal_error( "We're supposed to display the homepage here, instead of getting dispatch.pl" );
        } elsif (@components == 1) {
-           $what_to_do = 'search';
+           if ($components[0] eq 'index') {
+               $what_to_do = 'homepage';
+           } else {
+               $what_to_do = 'search';
+           }
        } else {
 
            for ($components[-1]) {
@@ -315,6 +336,7 @@ sub do_dispatch {
 
     #FIXME: ugly hack
     unless (($what_to_do eq 'allpackages' and $opts{format} =~ /^(html|txt\.gz)/)
+           || ($what_to_do eq 'index' and $opts{format} eq 'html')
            || -e "$TEMPLATEDIR/$opts{format}/${what_to_do}.tmpl") {
        fatal_error( $cat->g("requested format not available for this document"),
                     "406 requested format not available");
@@ -330,7 +352,14 @@ sub do_dispatch {
     $page_content{params} = \%params;
 
     unless (@Packages::CGI::fatal_errors) {
-       print $input->header(-charset => $charset, -type => get_mime($opts{format}) );
+       print $input->header(-charset => $charset,
+                            -type => get_mime($opts{format}),
+                            -vary => 'negotiate,accept-language',
+                            -last_modified => strftime("%a, %d %b %Y %T %z",
+                                                       localtime($last_modified)),
+                            -expires => strftime("%a, %d %b %Y %T %z",
+                                                 localtime($expires)),
+                            );
        #use Data::Dumper;
        #print '<pre>'.Dumper(\%ENV, \%page_content, get_all_messages()).'</pre>';
        print $template->page( $what_to_do, { %page_content, %{ get_all_messages() } } );