]> git.ipfire.org Git - thirdparty/bugzilla.git/commitdiff
Bug 629326: Make it simpler to check ETags
authorMax Kanat-Alexander <mkanat@bugzilla.org>
Mon, 26 Dec 2011 13:10:52 +0000 (14:10 +0100)
committerFrédéric Buclin <LpSolit@gmail.com>
Mon, 26 Dec 2011 13:10:52 +0000 (14:10 +0100)
r/a=LpSolit

Bugzilla/CGI.pm
config.cgi

index 9d8a1c48ffc0955b9c2081f0228e569cd0f6f3fe..e1e6af6aebc45a3163cc229a48b275f89e7c83df 100644 (file)
@@ -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;
index f83ffcdf325ab1d4e91487dfd7933fd3a531333f..fadc778b8b49d17007c81ce376203372d8fbcde9 100755 (executable)
@@ -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;
 }