From 37e65a3c81d24eed2154b08e0c86e4cb44e167d3 Mon Sep 17 00:00:00 2001 From: Max Kanat-Alexander Date: Mon, 26 Dec 2011 14:10:52 +0100 Subject: Bug 629326: Make it simpler to check ETags r/a=LpSolit --- Bugzilla/CGI.pm | 20 ++++++++++++++++++++ config.cgi | 39 +++++++++------------------------------ 2 files changed, 29 insertions(+), 30 deletions(-) diff --git a/Bugzilla/CGI.pm b/Bugzilla/CGI.pm index 9d8a1c48f..e1e6af6ae 100644 --- a/Bugzilla/CGI.pm +++ b/Bugzilla/CGI.pm @@ -214,6 +214,26 @@ sub clean_search_url { } } +sub check_etag { + my ($self, $valid_etag) = @_; + + # ETag support. + my $if_none_match = $self->http('If-None-Match'); + return if !$if_none_match; + + my @if_none = split(/[\s,]+/, $if_none_match); + foreach my $possible_etag (@if_none) { + # remove quotes from begin and end of the string + $possible_etag =~ s/^\"//g; + $possible_etag =~ s/\"$//g; + if ($possible_etag eq $valid_etag or $possible_etag eq '*') { + print $self->header(-ETag => $possible_etag, + -status => '304 Not Modified'); + exit; + } + } +} + # Overwrite to ensure nph doesn't get set, and unset HEADERS_ONCE sub multipart_init { my $self = shift; diff --git a/config.cgi b/config.cgi index f83ffcdf3..fadc778b8 100755 --- a/config.cgi +++ b/config.cgi @@ -44,15 +44,16 @@ use Digest::MD5 qw(md5_base64); my $user = Bugzilla->login(LOGIN_OPTIONAL); my $cgi = Bugzilla->cgi; +# Get data from the shadow DB as they don't change very often. +Bugzilla->switch_to_shadow_db; + # If the 'requirelogin' parameter is on and the user is not # authenticated, return empty fields. if (Bugzilla->params->{'requirelogin'} && !$user->id) { display_data(); + exit; } -# Get data from the shadow DB as they don't change very often. -Bugzilla->switch_to_shadow_db; - # Pass a bunch of Bugzilla configuration to the templates. my $vars = {}; $vars->{'priority'} = get_legal_field_values('priority'); @@ -136,31 +137,9 @@ sub display_data { 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; + $cgi->check_etag($digest); + + print $cgi->header (-ETag => $digest, + -type => $format->{'ctype'}); + print $output; } -- cgit v1.2.1