From: Junio C Hamano <hidden> Date: 2016-06-15 22:53:23
"W. Trevor King" [off-list ref] writes:
On Mon, Mar 26, 2012 at 10:12:36AM -0700, Junio C Hamano wrote:
...
Only passing in the epoch. We could reduce computation at the expense
of complication by passing in both the epoch and a formatted time
string, but after Jakub's suggestions, I felt like a simpler interface
was the better approach. I don't feel particularly committed to
either way, so just tell me which you'd like best ;).
The existing codepath already had the call to parse_date() nearby and that
was the only reason I made the suggestion. The caller in the snapshot
codepath would need to call parse_date() much earlier and it would have to
be conditional to the availability of %co, so the simpler interface would
probably be overall win.
quoted
Missing " &&" at the end (same in 3/3).
Oops. I wonder why my tests still passed :p. Will fix in v5.
The test will pass if there is no breakage. The offence of missing " &&"
after your "grep 200" is that it will let the test pass even if you did
not have "200" in the output, failing to catch future breakage.
From: W. Trevor King <hidden> Date: 2016-06-15 22:53:23
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 <redacted>
---
Patch v4 1/3 is unchanged. Should I mail it back in with a [PATCH v5
1/3] tag?
Changes since v4:
* die_if_unmodified() -> exit_if_unmodified_since()
* Added missing `&&` to tests for feed-last-modified (patch 2/3) and
snapshot-last-modified (patch 3/3).
gitweb/gitweb.perl | 40 +++++++++++++++++------------
t/t9501-gitweb-standalone-http-status.sh | 27 +++++++++++++++++++-
2 files changed, 49 insertions(+), 18 deletions(-)
@@ -7003,6 +7003,28 @@ sub snapshot_name {returnwantarray?($name,$name):$name;}+subexit_if_unmodified_since{+my($latest_epoch)=@_;+our$cgi;++my$if_modified=$cgi->http('IF_MODIFIED_SINCE');+if(defined$if_modified){+my$since;+if(eval{requireHTTP::Date;1;}){+$since=HTTP::Date::str2time($if_modified);+}elsif(eval{requireTime::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');+gotoDONE_GITWEB;+}+}+}+subgit_snapshot{my$format=$input_params{'snapshot_format'};if(!@snapshot_fmts){
@@ -7820,24 +7842,8 @@ sub git_feed {if(defined($commitlist[0])){%latest_commit=%{$commitlist[0]};my$latest_epoch=$latest_commit{'committer_epoch'};+exit_if_unmodified_since($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{requireHTTP::Date;1;}){-$since=HTTP::Date::str2time($if_modified);-}elsif(eval{requireTime::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',
@@ -92,7 +92,7 @@ test_debug 'cat gitweb.output' test_expect_success'snapshots: bad tree-ish id (tagged object)''echoobject>tag-object&&gitaddtag-object&&-gitcommit-m"Object to be tagged"&&+test_tick&&gitcommit-m"Object to be tagged"&&gittagtagged-object`githash-objecttag-object`&&gitweb_run"p=.git;a=snapshot;h=tagged-object;sf=tgz"&&grep"400 - Object is not a tree-ish"gitweb.output
From: Jakub Narebski <hidden> Date: 2016-06-15 22:53:24
On Mon, 26 Mar 2012, W. Trevor King wrote:
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.
Nice description, and I think quite good name for a subroutine. Well,
good enough; any more we would drown in bikeshed-ding.
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.
Good.
quoted hunk
Signed-off-by: W Trevor King <redacted>
---
Patch v4 1/3 is unchanged. Should I mail it back in with a
[PATCH v5 1/3] tag?
Changes since v4:
* die_if_unmodified() -> exit_if_unmodified_since()
* Added missing `&&` to tests for feed-last-modified (patch 2/3) and
snapshot-last-modified (patch 3/3).
gitweb/gitweb.perl | 40 +++++++++++++++++------------
t/t9501-gitweb-standalone-http-status.sh | 27 +++++++++++++++++++-
2 files changed, 49 insertions(+), 18 deletions(-)
...and use it if provided
+ my %latest_date = ref($latest_date) eq 'HASH'
+ ? %$latest_date : parse_date($latest_epoch);
but something is to be said for simplicity. We need epoch for comparison
anyway.
@@ -92,7 +92,7 @@ test_debug 'cat gitweb.output' test_expect_success'snapshots: bad tree-ish id (tagged object)''echoobject>tag-object&&gitaddtag-object&&-gitcommit-m"Object to be tagged"&&+test_tick&&gitcommit-m"Object to be tagged"&&gittagtagged-object`githash-objecttag-object`&&gitweb_run"p=.git;a=snapshot;h=tagged-object;sf=tgz"&&grep"400 - Object is not a tree-ish"gitweb.output
@@ -112,6 +112,31 @@ test_expect_success 'snapshots: bad object id' '' test_debug'cat gitweb.output'+# ----------------------------------------------------------------------+# modification times (Last-Modified and If-Modified-Since)++test_expect_success'modification: feed last-modified''+gitweb_run"p=.git;a=atom;h=master"&&+grep"Status: 200 OK"gitweb.output&&+grep"Last-modified: Thu, 7 Apr 2005 22:14:13 +0000"gitweb.output+'
All right.
What's that date from? Wouldn't it be better to read it from commit
object with `git show -s --pretty=%cD HEAD` or postprocessed from
'%ct' timestamp?
All right.
What's that date from? Wouldn't it be better to read it from commit
object with `git show -s --pretty=%cD HEAD` or postprocessed from
'%ct' timestamp?
That's the date set by the first `test_tick`, which is hardcoded in
`test-lib-functions.sh`. Extracting the date dynamically seems
unnecessary, since I can't imagine anyone changing the `test_tick`
date. It's easy enough to do if you think it is appropriate though…
All right.
What's that date from? Wouldn't it be better to read it from commit
object with `git show -s --pretty=%cD HEAD` or postprocessed from
'%ct' timestamp?
That's the date set by the first `test_tick`, which is hardcoded in
`test-lib-functions.sh`. Extracting the date dynamically seems
unnecessary, since I can't imagine anyone changing the `test_tick`
date.
Ah, it's all right then. I should have checked the test_tick function.
That of course assuming that nobody would add test_tick earlier, but
if he/she does, he/she can deal with fallout...
It's easy enough to do if you think it is appropriate though…
Changes since v5:
* Use `test_when_finished` to unset HTTP_IF_MODIFIED_SINCE.
* Actually use the tree ID in the `modification: tree snapshot` test.
* Conditional last_modified argument for `$cgi->header` git_snapshot
and git_feed.
* tree-ish -> trees in git_snapshot commit message and test name.
Unchanged since v5:
* Patch 1/3, but I'm resending it anyway with `git send-email`. I
could skip resending it with:
git send-email … HEAD^^
but that would mess up the patch numbering.
W. Trevor King (3):
gitweb: add `status` headers to git_feed() responses.
gitweb: refactor If-Modified-Since handling
gitweb: add If-Modified-Since handling to git_snapshot().
gitweb/gitweb.perl | 65 ++++++++++++++++++------------
t/t9501-gitweb-standalone-http-status.sh | 60 +++++++++++++++++++++++++++-
2 files changed, 98 insertions(+), 27 deletions(-)
--
1.7.3.4
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 <redacted>
---
gitweb/gitweb.perl | 57 +++++++++++++++--------------
t/t9501-gitweb-standalone-http-status.sh | 27 +++++++++++++-
2 files changed, 55 insertions(+), 29 deletions(-)
@@ -7003,6 +7003,28 @@ sub snapshot_name {returnwantarray?($name,$name):$name;}+subexit_if_unmodified_since{+my($latest_epoch)=@_;+our$cgi;++my$if_modified=$cgi->http('IF_MODIFIED_SINCE');+if(defined$if_modified){+my$since;+if(eval{requireHTTP::Date;1;}){+$since=HTTP::Date::str2time($if_modified);+}elsif(eval{requireTime::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');+gotoDONE_GITWEB;+}+}+}+subgit_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{requireHTTP::Date;1;}){-$since=HTTP::Date::str2time($if_modified);-}elsif(eval{requireTime::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',+-last_modified=>(%latest_date?$latest_date{'rfc2822'}:undef),+-status=>'200 OK');# Optimization: skip generating the body if client asks only# for Last-Modified date.
@@ -92,7 +92,7 @@ test_debug 'cat gitweb.output' test_expect_success'snapshots: bad tree-ish id (tagged object)''echoobject>tag-object&&gitaddtag-object&&-gitcommit-m"Object to be tagged"&&+test_tick&&gitcommit-m"Object to be tagged"&&gittagtagged-object`githash-objecttag-object`&&gitweb_run"p=.git;a=snapshot;h=tagged-object;sf=tgz"&&grep"400 - Object is not a tree-ish"gitweb.output
The git_feed() method was not setting a `Status` header unless it was
responding to an If-Modified-Since request with `304 Not Modified`.
Now, when it is serving successful responses, it sets status to `200
OK`.
Signed-off-by: W Trevor King <redacted>
---
gitweb/gitweb.perl | 6 ++++--
1 files changed, 4 insertions(+), 2 deletions(-)
@@ -7841,11 +7841,13 @@ sub git_feed {print$cgi->header(-type=>$content_type,-charset=>'utf-8',--last_modified=>$latest_date{'rfc2822'});+-last_modified=>$latest_date{'rfc2822'},+-status=>'200 OK');}else{print$cgi->header(-type=>$content_type,--charset=>'utf-8');+-charset=>'utf-8',+-status=>'200 OK');}# Optimization: skip generating the body if client asks only
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 <redacted>
---
gitweb/gitweb.perl | 10 +++++++++
t/t9501-gitweb-standalone-http-status.sh | 33 ++++++++++++++++++++++++++++++
2 files changed, 43 insertions(+), 0 deletions(-)
From: W. Trevor King <hidden> Date: 2016-06-15 22:53:24
On Wed, Mar 28, 2012 at 11:46:58AM -0400, wking@tremily.us wrote:
...
Oops, I set `sendemail.from`, but it doesn't look like it stuck, and I
forgot to check before OKing the mails. Please consider the v6
patches to be from `W. Trevor King [off-list ref]`, and adjust any
replies accordingly.
Sorry,
Trevor
--
This email may be signed or encrypted with GnuPG (http://www.gnupg.org).
For more information, see http://en.wikipedia.org/wiki/Pretty_Good_Privacy
From: Jakub Narebski <hidden> Date: 2016-06-15 22:53:24
On Wed, 28 Mar 2012, wking@tremily.us wrote:
quoted hunk
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 <redacted>
---
gitweb/gitweb.perl | 10 +++++++++
t/t9501-gitweb-standalone-http-status.sh | 33 ++++++++++++++++++++++++++++++
2 files changed, 43 insertions(+), 0 deletions(-)