diff options
-rw-r--r-- | CHANGELOG.txt | 2 | ||||
-rw-r--r-- | includes/bootstrap.inc | 2 | ||||
-rw-r--r-- | includes/common.inc | 2 | ||||
-rw-r--r-- | includes/tests/bootstrap.test | 26 | ||||
-rw-r--r-- | modules/block/block.module | 4 | ||||
-rw-r--r-- | modules/simpletest/drupal_web_test_case.php | 42 |
6 files changed, 69 insertions, 9 deletions
diff --git a/CHANGELOG.txt b/CHANGELOG.txt index 0bf687f89..b38b95a57 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -17,7 +17,7 @@ Drupal 7.0, xxxx-xx-xx (development version) order can now be customised using the Views module. * Added more features to the default install profile, and a new slimmed down install profile for developers. - * Image toolkits are added by modules instead of being copied to + * Image toolkits are added by modules instead of being copied to the includes directory. - Search: * Added support for language-aware searches. diff --git a/includes/bootstrap.inc b/includes/bootstrap.inc index 63f704a1d..06a154197 100644 --- a/includes/bootstrap.inc +++ b/includes/bootstrap.inc @@ -549,7 +549,7 @@ function page_get_cache() { $cache = NULL; - if (!$user->uid && $_SERVER['REQUEST_METHOD'] == 'GET' && count(drupal_set_message()) == 0) { + if (!$user->uid && ($_SERVER['REQUEST_METHOD'] == 'GET' || $_SERVER['REQUEST_METHOD'] == 'HEAD') && count(drupal_set_message()) == 0) { $cache = cache_get($base_root . request_uri(), 'cache_page'); if (empty($cache)) { diff --git a/includes/common.inc b/includes/common.inc index 7263d0a5b..ee604fb9e 100644 --- a/includes/common.inc +++ b/includes/common.inc @@ -2490,7 +2490,7 @@ function _drupal_bootstrap_full() { function page_set_cache() { global $user, $base_root; - if (!$user->uid && $_SERVER['REQUEST_METHOD'] == 'GET' && count(drupal_get_messages(NULL, FALSE)) == 0) { + if (!$user->uid && ($_SERVER['REQUEST_METHOD'] == 'GET' || $_SERVER['REQUEST_METHOD'] == 'HEAD') && count(drupal_get_messages(NULL, FALSE)) == 0) { // This will fail in some cases, see page_get_cache() for the explanation. if ($data = ob_get_contents()) { $cache = TRUE; diff --git a/includes/tests/bootstrap.test b/includes/tests/bootstrap.test index 4b2cf3089..3bb197aae 100644 --- a/includes/tests/bootstrap.test +++ b/includes/tests/bootstrap.test @@ -81,3 +81,29 @@ class BootstrapIPAddressTestCase extends DrupalWebTestCase { ); } } + +class BootstrapPageCacheTestCase extends DrupalWebTestCase { + + /** + * Implementation of getInfo(). + */ + function getInfo() { + return array( + 'name' => t('Page cache test'), + 'description' => t('Enable the page cache, submit a HEAD request and examine headers.'), + 'group' => t('Bootstrap') + ); + } + + /** + * Enable cache and examine HTTP headers. + */ + function testPageCache() { + global $base_url; + variable_set('cache', 1); + // Retrieve the front page, which has already been cached by $this->curlConnect(); + $this->drupalHead($base_url); + $this->assertText('ETag: ', t('Verify presence of ETag header indicating that page caching is enabled.')); + } + +} diff --git a/modules/block/block.module b/modules/block/block.module index 1d32f62d9..a7f46ef1f 100644 --- a/modules/block/block.module +++ b/modules/block/block.module @@ -478,8 +478,8 @@ function _block_render_blocks($region_blocks) { if ($block->enabled && $block->page_match) { // Try fetching the block from cache. Block caching is not compatible with // node_access modules. We also preserve the submission of forms in blocks, - // by fetching from cache only if the request method is 'GET'. - if (!count(module_implements('node_grants')) && $_SERVER['REQUEST_METHOD'] == 'GET' && ($cid = _block_get_cache_id($block)) && ($cache = cache_get($cid, 'cache_block'))) { + // by fetching from cache only if the request method is 'GET' (or 'HEAD'). + if (!count(module_implements('node_grants')) && ($_SERVER['REQUEST_METHOD'] == 'GET' || $_SERVER['REQUEST_METHOD'] == 'HEAD') && ($cid = _block_get_cache_id($block)) && ($cache = cache_get($cid, 'cache_block'))) { $array = $cache->data; } else { diff --git a/modules/simpletest/drupal_web_test_case.php b/modules/simpletest/drupal_web_test_case.php index 92250f62c..709759678 100644 --- a/modules/simpletest/drupal_web_test_case.php +++ b/modules/simpletest/drupal_web_test_case.php @@ -759,7 +759,7 @@ class DrupalWebTestCase { $this->_content = curl_exec($this->ch); $this->plain_text = FALSE; $this->elements = FALSE; - $this->assertTrue($this->_content !== FALSE, t('!method to !url, response is !length bytes.', array('!method' => empty($curl_options[CURLOPT_POSTFIELDS]) ? 'GET' : 'POST', '!url' => $url, '!length' => strlen($this->_content))), t('Browser')); + $this->assertTrue($this->_content !== FALSE, t('!method to !url, response is !length bytes.', array('!method' => !empty($curl_options[CURLOPT_NOBODY]) ? 'HEAD' : (empty($curl_options[CURLOPT_POSTFIELDS]) ? 'GET' : 'POST'), '!url' => $url, '!length' => strlen($this->_content))), t('Browser')); return $this->_content; } @@ -802,7 +802,7 @@ class DrupalWebTestCase { * Retrieves a Drupal path or an absolute path. * * @param $path - * Drupal path or url to load into internal browser + * Drupal path or URL to load into internal browser * @param $options * Options to be forwarded to url(). * @return @@ -814,7 +814,7 @@ class DrupalWebTestCase { // We re-using a CURL connection here. If that connection still has certain // options set, it might change the GET into a POST. Make sure we clear out // previous options. - $out = $this->curlExec(array(CURLOPT_HTTPGET => TRUE, CURLOPT_URL => url($path, $options))); + $out = $this->curlExec(array(CURLOPT_HTTPGET => TRUE, CURLOPT_URL => url($path, $options), CURLOPT_HEADER => FALSE, CURLOPT_NOBODY => FALSE)); $this->refreshVariables(); // Ensure that any changes to variables in the other thread are picked up. return $out; } @@ -874,7 +874,7 @@ class DrupalWebTestCase { } $post = implode('&', $post); } - $out = $this->curlExec(array(CURLOPT_URL => $action, CURLOPT_POST => TRUE, CURLOPT_POSTFIELDS => $post)); + $out = $this->curlExec(array(CURLOPT_URL => $action, CURLOPT_POST => TRUE, CURLOPT_POSTFIELDS => $post, CURLOPT_HEADER => FALSE, CURLOPT_NOBODY => FALSE)); // Ensure that any changes to variables in the other thread are picked up. $this->refreshVariables(); return $out; @@ -890,6 +890,40 @@ class DrupalWebTestCase { } /** + * Retrieves only the headers for a Drupal path or an absolute path. + * + * @param $path + * Drupal path or URL to load into internal browser + * @param $options + * Options to be forwarded to url(). + * @return + * The retrieved headers, also available as $this->drupalGetContent() + */ + function drupalHead($path, $options = array()) { + $options['absolute'] = TRUE; + $out = $this->curlExec(array(CURLOPT_HEADER => TRUE, CURLOPT_NOBODY => TRUE, CURLOPT_URL => url($path, $options))); + $this->refreshVariables(); // Ensure that any changes to variables in the other thread are picked up. + return $out; + } + + /** + * Retrieves only the headers for a Drupal path or an absolute path. + * + * @param $path + * Drupal path or url to load into internal browser + * @param $options + * Options to be forwarded to url(). + * @return + * The retrieved headers, also available as $this->drupalGetContent() + */ + function drupalHead($path, $options = array()) { + $options['absolute'] = TRUE; + $out = $this->curlExec(array(CURLOPT_HEADER => TRUE, CURLOPT_NOBODY => TRUE, CURLOPT_URL => url($path, $options))); + $this->refreshVariables(); // Ensure that any changes to variables in the other thread are picked up. + return $out; + } + + /** * Handle form input related to drupalPost(). Ensure that the specified fields * exist and attempt to create POST data in the correct manner for the particular * field type. |