Re: [PATCH v6 3/3] gitweb: add If-Modified-Since handling to git_snapshot().
On Wed, 28 Mar 2012, wking@tremily.us wrote:
Show 24 quoted lines
> Because snapshots can be large, you can save some bandwidth by
> supporting caching via If-Modified-Since. This patch adds support for
> the i-m-s request to git_snapshot() if the request is a commit.
> Requests for snapshots of trees, which lack well defined timestamps,
> are still handled as they were before.
>
> Signed-off-by: W Trevor King <wking@drexel.edu>
> ---
> gitweb/gitweb.perl | 10 +++++++++
> t/t9501-gitweb-standalone-http-status.sh | 33 ++++++++++++++++++++++++++++++
> 2 files changed, 43 insertions(+), 0 deletions(-)
>
> diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl
> index ba106c1..591c793 100755
> --- a/gitweb/gitweb.perl
> +++ b/gitweb/gitweb.perl
> @@ -7051,6 +7051,10 @@ sub git_snapshot {
>
> my ($name, $prefix) = snapshot_name($project, $hash);
> my $filename = "$name$known_snapshot_formats{$format}{'suffix'}";
> +
> + my %co = parse_commit($hash);
> + exit_if_unmodified_since($co{'committer_epoch'}) if %co;
> +Show 12 quoted lines
> my $cmd = quote_command(
> git_cmd(), 'archive',
> "--format=$known_snapshot_formats{$format}{'format'}",
> @@ -7060,9 +7064,15 @@ sub git_snapshot {
> }
>
> $filename =~ s/(["\\])/\\$1/g;
> + my %latest_date;
> + if (%co) {
> + %latest_date = parse_date($co{'committer_epoch'}, $co{'committer_tz'});
> + }
> +That is probably more readable than
+ %latest_date = parse_date($co{'committer_epoch'}, $co{'committer_tz'})
+ if %co;Show 6 quoted lines
> print $cgi->header(
> -type => $known_snapshot_formats{$format}{'type'},
> -content_disposition => 'inline; filename="' . $filename . '"',
> + -last_modified => (%co ? $latest_date{'rfc2822'} : undef),
> -status => '200 OK');
> Same issue as with previous patch:
print $cgi->header(
-type => $known_snapshot_formats{$format}{'type'},
-content_disposition => 'inline; filename="' . $filename . '"',
+ %co ? (-last_modified => $latest_date{'rfc2822'}) : (),
-status => '200 OK');Show 41 quoted lines
> open my $fd, "-|", $cmd
> diff --git a/t/t9501-gitweb-standalone-http-status.sh b/t/t9501-gitweb-standalone-http-status.sh
> index afa6bd4..1487820 100755
> --- a/t/t9501-gitweb-standalone-http-status.sh
> +++ b/t/t9501-gitweb-standalone-http-status.sh
> @@ -138,6 +138,39 @@ test_expect_success 'modification: feed if-modified-since (unmodified)' '
> '
> test_debug 'cat gitweb.headers'
>
> +test_expect_success 'modification: snapshot last-modified' '
> + gitweb_run "p=.git;a=snapshot;h=master;sf=tgz" &&
> + grep "Status: 200 OK" gitweb.output &&
> + grep "Last-modified: Thu, 7 Apr 2005 22:14:13 +0000" gitweb.output
> +'
> +test_debug 'cat gitweb.headers'
> +
> +test_expect_success 'modification: snapshot if-modified-since (modified)' '
> + export HTTP_IF_MODIFIED_SINCE="Wed, 6 Apr 2005 22:14:13 +0000" &&
> + test_when_finished "unset HTTP_IF_MODIFIED_SINCE" &&
> + gitweb_run "p=.git;a=snapshot;h=master;sf=tgz" &&
> + grep "Status: 200 OK" gitweb.output
> +'
> +test_debug 'cat gitweb.headers'
> +
> +test_expect_success 'modification: snapshot if-modified-since (unmodified)' '
> + export HTTP_IF_MODIFIED_SINCE="Thu, 7 Apr 2005 22:14:13 +0000" &&
> + test_when_finished "unset HTTP_IF_MODIFIED_SINCE" &&
> + gitweb_run "p=.git;a=snapshot;h=master;sf=tgz" &&
> + grep "Status: 304 Not Modified" gitweb.output
> +'
> +test_debug 'cat gitweb.headers'
> +
> +test_expect_success 'modification: tree snapshot' '
> + ID=`git rev-parse --verify HEAD^{tree}` &&
> + export HTTP_IF_MODIFIED_SINCE="Wed, 6 Apr 2005 22:14:13 +0000" &&
> + test_when_finished "unset HTTP_IF_MODIFIED_SINCE" &&
> + gitweb_run "p=.git;a=snapshot;h=$ID;sf=tgz" &&
> + grep "Status: 200 OK" gitweb.output &&
> + ! grep "Last-Modified" gitweb.output
> +'
> +test_debug 'cat gitweb.headers'--
Jakub Narebski
Poland