gitweb: refactor If-Modified-Since handling

The current gitweb only generates Last-Modified and handles
If-Modified-Since headers for the git_feed action.  This patch breaks
the Last-Modified and If-Modified-Since handling code out from
git_feed into a new function exit_if_unmodified_since.  This makes the
code easy to reuse for other actions.

Only gitweb actions which can easily calculate a modification time
should use exit_if_unmodified_since, as the goal is to balance local
processing time vs. upload bandwidth.

Signed-off-by: W Trevor King <wking@drexel.edu>
Acked-by: Jakub Narebski <jnareb@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
W. Trevor King
2012-03-29 08:45:48 -04:00
committed by Junio C Hamano
parent e1c3643ff7
commit b7d565ea4c
2 changed files with 55 additions and 29 deletions

View File

@ -7003,6 +7003,28 @@ sub snapshot_name {
return wantarray ? ($name, $name) : $name;
}
sub exit_if_unmodified_since {
my ($latest_epoch) = @_;
our $cgi;
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) {
my %latest_date = parse_date($latest_epoch);
print $cgi->header(
-last_modified => $latest_date{'rfc2822'},
-status => '304 Not Modified');
goto DONE_GITWEB;
}
}
}
sub git_snapshot {
my $format = $input_params{'snapshot_format'};
if (!@snapshot_fmts) {
@ -7820,35 +7842,14 @@ sub git_feed {
if (defined($commitlist[0])) {
%latest_commit = %{$commitlist[0]};
my $latest_epoch = $latest_commit{'committer_epoch'};
%latest_date = parse_date($latest_epoch, $latest_commit{'comitter_tz'});
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',
-last_modified => $latest_date{'rfc2822'},
-status => '200 OK');
} else {
print $cgi->header(
-type => $content_type,
-charset => 'utf-8',
-status => '200 OK');
exit_if_unmodified_since($latest_epoch);
%latest_date = parse_date($latest_epoch, $latest_commit{'comitter_tz'});
}
print $cgi->header(
-type => $content_type,
-charset => 'utf-8',
%latest_date ? (-last_modified => $latest_date{'rfc2822'}) : (),
-status => '200 OK');
# Optimization: skip generating the body if client asks only
# for Last-Modified date.