All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jakub Narebski <jnareb@gmail.com>
To: "W. Trevor King" <wking@drexel.edu>
Cc: git@vger.kernel.org
Subject: Re: [PATCH v3] Isolate If-Modified-Since handling in gitweb
Date: Wed, 21 Mar 2012 06:19:51 -0700 (PDT)	[thread overview]
Message-ID: <m3sjh2ay6j.fsf@localhost.localdomain> (raw)
In-Reply-To: <20120321121126.GA27660@odin.tremily.us>

By the way, it is custom on this mailing list to usually Cc (send a
copy) to all people participating in discussion, and not only to git
mailing list.

"W. Trevor King" <wking@drexel.edu> writes:

> Subject: [PATCH v3] Isolate If-Modified-Since handling in gitweb

Perhaps a better title would be:

  gitweb: Refactor If-Modified-Since handling, support in snapshot

to mention all that thispatch does.  Though trouble with coming up
with a short but fairly complete one-line summary might mean that this
patch would be better split in two: refactoring and adding support for
If-Modified-Since to snapshots.

> 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 die_if_unmodified.  This makes the code
> easy to reuse for other actions

O.K.

>                                  where it is appropriate
                                   ^^^^^^^^^^^^^^^^^^^^^^^

This doesn't add any information.  I think it the commit message would
be better if you either remove this, or expand (in a separate
paragraph) where support for If-Modified-Since might make sense, and
where it could not.

>                                                         and adds the
> code to do that to git_snapshot.

This would read better as a separate paragraph.
 
> Signed-off-by: W Trevor King <wking@drexel.edu>                                 
> ---
> Changed since v2:
>   - Shorter title.
>   - Fixed modified_since -> die_if_unmodified in commit message.

Nice.

BTW. what happened to diffstat?

Tests (to be put, I think, in t/t9501-gitweb-standalone-http-status.sh)?
We could use test_tick() and $test_tick for that (or extract formatted
committer date from a commit).
 
> diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl
> index a8b5fad..b944351 100755
> --- a/gitweb/gitweb.perl
> +++ b/gitweb/gitweb.perl
> @@ -7003,6 +7003,28 @@ sub snapshot_name {
>  	return wantarray ? ($name, $name) : $name;
>  }
>  
> +sub die_if_unmodified {
> +	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;
> +		}
> +	}
> +}

O.K.

die_if_unmodified() is good enough name, though I wonder if we could
come up with a better name....

> +
>  sub git_snapshot {
>  	my $format = $input_params{'snapshot_format'};
>  	if (!@snapshot_fmts) {
> @@ -7029,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) or die_error(404, "Unknown commit object");
> +	die_if_unmodified($co{'committer_epoch'});
> +

That unexplainably changes behavior of 'snapshot' action.  Before we
would accept snapshot of a tree given by its SHA-1, now we do not.

This might be a good idea from a security point of view wrt. leaking
information (c.f. "git archive --remote" behavior), but it at least
needs to be explained in commit message, and perhaps even in a comment
above this line.

Alternative solution would be to skip If-Modified-Since handling if we
request snapshot by tree id:

  +
  +	my %co = parse_commit($hash);
  +	die_if_unmodified($co{'committer_epoch'}) if %co;
  +

> @@ -7038,9 +7064,11 @@ sub git_snapshot {
>  	}
>  
>  	$filename =~ s/(["\\])/\\$1/g;
> +	my %latest_date = parse_date($co{'committer_epoch'}, $co{'committer_tz'});
>  	print $cgi->header(
>  		-type => $known_snapshot_formats{$format}{'type'},
>  		-content_disposition => 'inline; filename="' . $filename . '"',
> +		-last_modified => $latest_date{'rfc2822'},
>  		-status => '200 OK');

Of course this would need to be updated too.
  
>  	open my $fd, "-|", $cmd
> @@ -7820,24 +7848,8 @@ sub git_feed {
>  	if (defined($commitlist[0])) {
>  		%latest_commit = %{$commitlist[0]};
>  		my $latest_epoch = $latest_commit{'committer_epoch'};
> +		die_if_unmodified($latest_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',

Nice.

-- 
Jakub Narebski

  reply	other threads:[~2012-03-21 13:20 UTC|newest]

Thread overview: 46+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-03-20  0:23 What's cooking in git.git (Mar 2012, #07; Mon, 19) Junio C Hamano
2012-03-15  7:54 ` [PATCH] Pull gitweb If-Modified-Since handling out into its own function and use for snapshots W. Trevor King
2012-03-20  1:48   ` W. Trevor King
2012-03-20 23:07     ` Junio C Hamano
2012-03-20 11:55   ` Jakub Narebski
2012-03-20 16:40     ` [PATCH v2] " W. Trevor King
2012-03-21 12:11       ` [PATCH v3] Isolate If-Modified-Since handling in gitweb W. Trevor King
2012-03-21 13:19         ` Jakub Narebski [this message]
2012-03-21 14:04           ` W. Trevor King
2012-03-21 16:55             ` Jakub Narebski
2012-03-21 17:38               ` W. Trevor King
2012-03-21 19:22                 ` Junio C Hamano
2012-03-21 19:55                   ` W. Trevor King
2012-03-21 20:04                     ` Jakub Narebski
2012-03-21 20:09                       ` Junio C Hamano
2012-03-21 20:34                         ` W. Trevor King
2012-03-22 13:05                 ` Jakub Narebski
2012-03-21 17:21           ` Junio C Hamano
2012-03-22 12:46             ` Jakub Narebski
2012-03-22 17:00               ` Junio C Hamano
2012-03-26 11:09               ` [PATCH v4 0/3] " W. Trevor King
2012-03-26 11:11                 ` [PATCH v4 1/3] gitweb: add `status` headers to git_feed() responses W. Trevor King
2012-03-26 11:12                 ` [PATCH v4 2/3] gitweb: refactor If-Modified-Since handling W. Trevor King
2012-03-26 17:12                   ` Junio C Hamano
2012-03-26 11:13                 ` [PATCH v4 3/3] gitweb: add If-Modified-Since handling to git_snapshot() W. Trevor King
2012-03-26 19:14                   ` [PATCH v5 " W. Trevor King
2012-03-27 22:31                     ` Jakub Narebski
2012-03-28 13:58                       ` W. Trevor King
2012-03-27 19:24                 ` [PATCH v4 0/3] Isolate If-Modified-Since handling in gitweb Jakub Narebski
2012-03-27 19:49                   ` W. Trevor King
2012-03-27 19:57                     ` Jakub Narebski
2012-03-27 19:55                   ` W. Trevor King
2012-03-27 20:18                     ` Junio C Hamano
2012-03-26 17:36     ` [PATCH v4 2/3] gitweb: refactor If-Modified-Since handling W. Trevor King
2012-03-26 18:39       ` Junio C Hamano
2012-03-26 19:12         ` [PATCH v5 " W. Trevor King
2012-03-27 22:24           ` Jakub Narebski
2012-03-28 13:51             ` W. Trevor King
2012-03-28 14:13               ` Jakub Narebski
2012-03-28 15:46                 ` [PATCH v6 0/3] " wking
2012-03-28 15:46                   ` [PATCH v6 1/3] gitweb: add `status` headers to git_feed() responses wking
2012-03-28 15:47                   ` [PATCH v6 2/3] gitweb: refactor If-Modified-Since handling wking
2012-03-28 15:47                   ` [PATCH v6 3/3] gitweb: add If-Modified-Since handling to git_snapshot() wking
2012-03-28 16:08                     ` Jakub Narebski
2012-03-28 15:56                   ` [PATCH v6 0/3] gitweb: refactor If-Modified-Since handling W. Trevor King
2012-03-20 23:35 ` Incremental updates to What's cooking Junio C Hamano

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=m3sjh2ay6j.fsf@localhost.localdomain \
    --to=jnareb@gmail.com \
    --cc=git@vger.kernel.org \
    --cc=wking@drexel.edu \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.