diff options
author | Giuseppe Bilotta <giuseppe.bilotta@gmail.com> | 2009-01-26 12:50:16 +0100 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2009-01-28 14:13:54 -0800 |
commit | cd956c73a2cce6613a6cd19df6ccb9ff1b08f79a (patch) | |
tree | 3943c19caa44d874a016b11de71e81a47313696f | |
parent | 2757b54d469783ea9eac3ba366c4ffaa194c990d (diff) | |
download | git-cd956c73a2cce6613a6cd19df6ccb9ff1b08f79a.tar.gz git-cd956c73a2cce6613a6cd19df6ccb9ff1b08f79a.tar.xz |
gitweb: check if-modified-since for feeds
Offering Last-modified header for feeds is only half the work, even if
we bail out early on HEAD requests. We should also check that same date
against If-modified-since, and bail out early with 304 Not Modified if
that's the case.
Signed-off-by: Giuseppe Bilotta <giuseppe.bilotta@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rwxr-xr-x | gitweb/gitweb.perl | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl index 8c49c75f1..f4defb01d 100755 --- a/gitweb/gitweb.perl +++ b/gitweb/gitweb.perl @@ -6015,7 +6015,25 @@ sub git_feed { } if (defined($commitlist[0])) { %latest_commit = %{$commitlist[0]}; - %latest_date = parse_date($latest_commit{'committer_epoch'}); + my $latest_epoch = $latest_commit{'committer_epoch'}; + %latest_date = parse_date($latest_epoch); + my $if_modified = $cgi->http('IF_MODIFIED_SINCE'); + if (defined $if_modified) { + my $since; + if (eval { require HTTP::Date; 1; }) { + $since = HTTP::Date::str2time($if_modified); + } elsif (eval { require Time::ParseDate; 1; }) { + $since = Time::ParseDate::parsedate($if_modified, GMT => 1); + } + if (defined $since && $latest_epoch <= $since) { + print $cgi->header( + -type => $content_type, + -charset => 'utf-8', + -last_modified => $latest_date{'rfc2822'}, + -status => '304 Not Modified'); + return; + } + } print $cgi->header( -type => $content_type, -charset => 'utf-8', |