Commit 37e65a3c authored by Max Kanat-Alexander's avatar Max Kanat-Alexander Committed by Frédéric Buclin

Bug 629326: Make it simpler to check ETags

r/a=LpSolit
parent 6d02055d
...@@ -214,6 +214,26 @@ sub clean_search_url { ...@@ -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 # Overwrite to ensure nph doesn't get set, and unset HEADERS_ONCE
sub multipart_init { sub multipart_init {
my $self = shift; my $self = shift;
......
...@@ -44,15 +44,16 @@ use Digest::MD5 qw(md5_base64); ...@@ -44,15 +44,16 @@ use Digest::MD5 qw(md5_base64);
my $user = Bugzilla->login(LOGIN_OPTIONAL); my $user = Bugzilla->login(LOGIN_OPTIONAL);
my $cgi = Bugzilla->cgi; 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 # If the 'requirelogin' parameter is on and the user is not
# authenticated, return empty fields. # authenticated, return empty fields.
if (Bugzilla->params->{'requirelogin'} && !$user->id) { if (Bugzilla->params->{'requirelogin'} && !$user->id) {
display_data(); 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. # Pass a bunch of Bugzilla configuration to the templates.
my $vars = {}; my $vars = {};
$vars->{'priority'} = get_legal_field_values('priority'); $vars->{'priority'} = get_legal_field_values('priority');
...@@ -136,31 +137,9 @@ sub display_data { ...@@ -136,31 +137,9 @@ sub display_data {
utf8::encode($digest_data) if utf8::is_utf8($digest_data); utf8::encode($digest_data) if utf8::is_utf8($digest_data);
my $digest = md5_base64($digest_data); my $digest = md5_base64($digest_data);
# ETag support. $cgi->check_etag($digest);
my $if_none_match = $cgi->http('If-None-Match') || "";
my $found304; print $cgi->header (-ETag => $digest,
my @if_none = split(/[\s,]+/, $if_none_match); -type => $format->{'ctype'});
foreach my $if_none (@if_none) { print $output;
# 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;
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment