From 6188fad092e9f347a111ed30d0e21bb048d69998 Mon Sep 17 00:00:00 2001 From: "mkanat%bugzilla.org" <> Date: Mon, 9 Nov 2009 19:04:50 +0000 Subject: Bug 515644: Provide ETag support for config.cgi Patch by Frank Becker r=mkanat, a=mkanat --- config.cgi | 42 +++++++++++++++++++++++++++++++++++++----- 1 file changed, 37 insertions(+), 5 deletions(-) (limited to 'config.cgi') diff --git a/config.cgi b/config.cgi index 282b95957..2d8c2d92c 100755 --- a/config.cgi +++ b/config.cgi @@ -20,6 +20,7 @@ # # Contributor(s): Terry Weissman # Myk Melez +# Frank Becker ################################################################################ # Script Initialization @@ -36,6 +37,7 @@ use Bugzilla::Error; use Bugzilla::Keyword; use Bugzilla::Status; use Bugzilla::Field; +use Digest::MD5 qw(md5_base64); my $user = Bugzilla->login(LOGIN_OPTIONAL); my $cgi = Bugzilla->cgi; @@ -110,11 +112,41 @@ sub display_data { my $format = $template->get_format("config", scalar($cgi->param('format')), scalar($cgi->param('ctype')) || "js"); - # Return HTTP headers. - print "Content-Type: $format->{'ctype'}\n\n"; - - # Generate the configuration file and return it to the user. - $template->process($format->{'template'}, $vars) + # Generate the configuration data. + my $output; + $template->process($format->{'template'}, $vars, \$output) || ThrowTemplateError($template->error()); + + # Wide characters cause md5_base64() to die. + my $digest_data = $output; + utf8::encode($digest_data) if utf8::is_utf8($digest_data); + my $digest = md5_base64($digest_data); + + # ETag support. + my $if_none_match = $cgi->http('If-None-Match') || ""; + my $found304; + my @if_none = split(/[\s,]+/, $if_none_match); + foreach my $if_none (@if_none) { + # remove quotes from begin and end of the string + $if_none =~ s/^\"//g; + $if_none =~ s/\"$//g; + if ($if_none eq $digest or $if_none eq '*') { + # leave the loop after the first match + $found304 = $if_none; + last; + } + } + + if ($found304) { + print $cgi->header(-type => 'text/html', + -ETag => $found304, + -status => '304 Not Modified'); + } + else { + # Return HTTP headers. + print $cgi->header (-ETag => $digest, + -type => $format->{'ctype'}); + print $output; + } exit; } -- cgit v1.2.1