Commit 6cd1aae9 authored by David Rothstein's avatar David Rothstein
Browse files

Issue #1476810 by Spleshka, David_Rothstein, franz | Heine:...

Issue #1476810 by Spleshka, David_Rothstein, franz | Heine: Drupal_serve_page_from_cache can serve uncompressed data with Content-Encoding gzip header with page_cache_without_database = 1.
parent 001532a0
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line

Drupal 7.25, xxxx-xx-xx (development version)
-----------------------
- Fixed a bug which caused cached pages to sometimes be sent to the browser
  with incorrect compression. The fix adds a new 'page_compressed' key to the
  $cache->data array returned by drupal_page_get_cache() (minor data structure
  change).
- Fixed broken tests on PHP 5.5.
- Made the File and Image modules more robust when saving entities that have
  deleted files attached. The code in file_field_presave() will now remove the
+1 −1
Original line number Diff line number Diff line
@@ -1278,7 +1278,7 @@ function drupal_page_header() {
 */
function drupal_serve_page_from_cache(stdClass $cache) {
  // Negotiate whether to use compression.
  $page_compression = variable_get('page_compression', TRUE) && extension_loaded('zlib');
  $page_compression = !empty($cache->data['page_compressed']);
  $return_compressed = $page_compression && isset($_SERVER['HTTP_ACCEPT_ENCODING']) && strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') !== FALSE;

  // Get headers set in hook_boot(). Keys are lower-case.
+8 −1
Original line number Diff line number Diff line
@@ -5176,6 +5176,10 @@ function drupal_page_set_cache() {
  global $base_root;

  if (drupal_page_is_cacheable()) {

    // Check whether the current page might be compressed.
    $page_compressed = variable_get('page_compression', TRUE) && extension_loaded('zlib');

    $cache = (object) array(
      'cid' => $base_root . request_uri(),
      'data' => array(
@@ -5183,6 +5187,9 @@ function drupal_page_set_cache() {
        'body' => ob_get_clean(),
        'title' => drupal_get_title(),
        'headers' => array(),
        // We need to store whether page was compressed or not,
        // because by the time it is read, the configuration might change.
        'page_compressed' => $page_compressed,
      ),
      'expire' => CACHE_TEMPORARY,
      'created' => REQUEST_TIME,
@@ -5200,7 +5207,7 @@ function drupal_page_set_cache() {
    }

    if ($cache->data['body']) {
      if (variable_get('page_compression', TRUE) && extension_loaded('zlib')) {
      if ($page_compressed) {
        $cache->data['body'] = gzencode($cache->data['body'], 9, FORCE_GZIP);
      }
      cache_set($cache->cid, $cache->data, 'cache_page', $cache->expire);
+12 −0
Original line number Diff line number Diff line
@@ -219,6 +219,18 @@ class BootstrapPageCacheTestCase extends DrupalWebTestCase {
    $this->assertFalse($this->drupalGetHeader('Content-Encoding'), 'A Content-Encoding header was not sent.');
    $this->assertTitle(t('Welcome to @site-name | @site-name', array('@site-name' => variable_get('site_name', 'Drupal'))), 'Site title matches.');
    $this->assertRaw('</html>', 'Page was not compressed.');

    // Disable compression mode.
    variable_set('page_compression', FALSE);

    // Verify if cached page is still available for a client with compression support.
    $this->drupalGet('', array(), array('Accept-Encoding: gzip,deflate'));
    $this->drupalSetContent(gzinflate(substr($this->drupalGetContent(), 10, -8)));
    $this->assertRaw('</html>', 'Page was delivered after compression mode is changed (compression support enabled).');

    // Verify if cached page is still available for a client without compression support.
    $this->drupalGet('');
    $this->assertRaw('</html>', 'Page was delivered after compression mode is changed (compression support disabled).');
  }
}