From: Jakub Narebski <jnareb@gmail.com>
To: "W. Trevor King" <wking@drexel.edu>
Cc: git@vger.kernel.org
Subject: Re: [PATCH] Pull gitweb If-Modified-Since handling out into its own function and use for snapshots.
Date: Tue, 20 Mar 2012 04:55:45 -0700 (PDT) [thread overview]
Message-ID: <m37gyf4hc3.fsf@localhost.localdomain> (raw)
In-Reply-To: <20120315075407.GA18246@odin.tremily.us>
I'm sorry I am only now answering, but unfortunately this patch has
fallen thought crack.
"W. Trevor King" <wking@drexel.edu> writes:
> 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 modified_since. This makes the code easy
> to reuse for other actions where it is appropriate,
That is a very good idea.
Of course adding support for If-Modified-Since has sense only if we
can calculate modification time without doing all the work (and
calculating modification time separately doesn;t add to work to be
done), or at least we are to send large amount of data so even if we
cannot save CPU time and I/O hit we can save network bandwidth.
> and I've added the code to do that in git_snapshot.
Nitpick about grammar: here you change from impersonal to personal
form in commit message, unnecessarily I think.
> Signed-off-by: W Trevor King <wking@drexel.edu>
>
> ---
> gitweb/gitweb.perl | 54 ++++++++++++++++++++++++++++++++++++---------------
> 1 files changed, 38 insertions(+), 16 deletions(-)
>
> diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl
> index a8b5fad..96a13e7 100755
> --- a/gitweb/gitweb.perl
> +++ b/gitweb/gitweb.perl
> @@ -7003,6 +7003,31 @@ sub snapshot_name {
> return wantarray ? ($name, $name) : $name;
> }
>
> +sub modified_since {
> + my ($content_type, $latest_epoch, $timezone) = @_;
Passing $content_type to function named modified_since() looks quite
strange to me.
> + 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, $timezone);
Shouldn't we pass \%latest_date (or rather \%modification_date to be
more generic)? Ah, I see that parse_date() subroutine does not store
original epoch not original timezone.
By the way, for $latest_date{'rfc2822'} we don't need $timezone
argument, and I think we should not pass it to generic
modified_since() function (or whatever it will be called).
> + print $cgi->header(
> + -type => $content_type,
> + -charset => 'utf-8',
Do we need -charset here? There is no HTTP body, and -charset => 'utf-8'
is incorrect for snapshots (with e.g. 'application/x-zip' $content_type)
> + -last_modified => $latest_date{'rfc2822'},
> + -status => '304 Not Modified');
> + return 0;
> + }
> + }
> + return 1;
> +}
> +
> sub git_snapshot {
> my $format = $input_params{'snapshot_format'};
> if (!@snapshot_fmts) {
> @@ -7029,6 +7054,14 @@ 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");
> + if (! modified_since($known_snapshot_formats{$format}{'type'},
> + $co{'committer_epoch'},
> + $co{'committer_tz'})) {
> + return;
> + }
For a function named modified_since(), it does too many things.
I think a better idea would be to make this function/subroutine (named
e.g. if_modified_since() or something like that) to work more like
die_error() -- it should simply end request instead of having caller
to use complcated calling convention, and care about eraly termination
by itself.
This means turning modified_since() into subroutine (and renaming it),
and ending it with
goto DONE_GITWEB;
or
goto DONE_REQUEST;
depending on the code base you are applying to.
> +
> my $cmd = quote_command(
> git_cmd(), 'archive',
> "--format=$known_snapshot_formats{$format}{'format'}",
> @@ -7038,9 +7071,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');
>
Have you run gitweb tests? This simply has no way of working, as %co
variable you use here is not defined anywhere in git_snapshot()
subroutine.
What if there is no commit, for example if we are rewuesting snapshot
of a tree by its SHA-1? We need to be able to deal with sich
situation, if only by not handling Last-Modified / If-Modified-Since.
> open my $fd, "-|", $cmd
> @@ -7821,22 +7856,9 @@ sub git_feed {
> %latest_commit = %{$commitlist[0]};
> my $latest_epoch = $latest_commit{'committer_epoch'};
> %latest_date = parse_date($latest_epoch, $latest_commit{'comitter_tz'});
Do we use %latest_date beside handling If-Modified-Since? Is there a
need for separate $latest_epoch and %;atest_date variables?
> - 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;
> - }
> + if (! modified_since($content_type, $latest_epoch,
> + $latest_commit{'comitter_tz'})) {
> + return;
> }
> print $cgi->header(
> -type => $content_type,
> --
> 1.7.3.4
--
Jakub Narebski
next prev parent reply other threads:[~2012-03-20 11:56 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 [this message]
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
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=m37gyf4hc3.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.