Loading core/assets/scaffold/files/default.services.yml +2 −1 Original line number Diff line number Diff line Loading @@ -118,7 +118,8 @@ parameters: # Cacheability debugging: # # Responses with cacheability metadata (CacheableResponseInterface instances) # get X-Drupal-Cache-Tags and X-Drupal-Cache-Contexts headers. # get X-Drupal-Cache-Tags, X-Drupal-Cache-Contexts and X-Drupal-Cache-Max-Age # headers. # # For more information about debugging cacheable responses, see # https://www.drupal.org/developing/api/8/response/cacheable-response-interface Loading core/lib/Drupal/Core/EventSubscriber/FinishResponseSubscriber.php +8 −0 Original line number Diff line number Diff line Loading @@ -156,6 +156,14 @@ public function onRespond(ResponseEvent $event) { $response_cacheability = $response->getCacheableMetadata(); $response->headers->set('X-Drupal-Cache-Tags', implode(' ', $response_cacheability->getCacheTags())); $response->headers->set('X-Drupal-Cache-Contexts', implode(' ', $this->cacheContextsManager->optimizeTokens($response_cacheability->getCacheContexts()))); $max_age_message = $response_cacheability->getCacheMaxAge(); if ($max_age_message === 0) { $max_age_message = '0 (Uncacheable)'; } elseif ($max_age_message === -1) { $max_age_message = '-1 (Permanent)'; } $response->headers->set('X-Drupal-Cache-Max-Age', $max_age_message); } $is_cacheable = ($this->requestPolicy->check($request) === RequestPolicyInterface::ALLOW) && ($this->responsePolicy->check($response, $request) !== ResponsePolicyInterface::DENY); Loading core/modules/system/tests/src/Functional/Routing/RouterTest.php +6 −0 Original line number Diff line number Diff line Loading @@ -54,6 +54,7 @@ public function testFinishResponseSubscriber() { $headers = $session->getResponseHeaders(); $this->assertEqual($headers['X-Drupal-Cache-Contexts'], [implode(' ', $expected_cache_contexts)]); $this->assertEqual($headers['X-Drupal-Cache-Tags'], ['config:user.role.anonymous http_response rendered']); $this->assertEqual($headers['X-Drupal-Cache-Max-Age'], ['-1 (Permanent)']); // Confirm that the page wrapping is being added, so we're not getting a // raw body returned. $this->assertRaw('</html>', 'Page markup was found.'); Loading @@ -68,6 +69,7 @@ public function testFinishResponseSubscriber() { $headers = $session->getResponseHeaders(); $this->assertEqual($headers['X-Drupal-Cache-Contexts'], [implode(' ', Cache::mergeContexts($renderer_required_cache_contexts, ['url']))]); $this->assertEqual($headers['X-Drupal-Cache-Tags'], ['config:user.role.anonymous foo http_response rendered']); $this->assertEqual($headers['X-Drupal-Cache-Max-Age'], ['60']); // 2. controller result: render array, per-role cacheable route access. $this->drupalGet('router_test/test19'); $headers = $session->getResponseHeaders(); Loading @@ -78,11 +80,13 @@ public function testFinishResponseSubscriber() { $headers = $session->getResponseHeaders(); $this->assertFalse(isset($headers['X-Drupal-Cache-Contexts'])); $this->assertFalse(isset($headers['X-Drupal-Cache-Tags'])); $this->assertFalse(isset($headers['X-Drupal-Cache-Max-Age'])); // 4. controller result: Response object, per-role cacheable route access. $this->drupalGet('router_test/test20'); $headers = $session->getResponseHeaders(); $this->assertFalse(isset($headers['X-Drupal-Cache-Contexts'])); $this->assertFalse(isset($headers['X-Drupal-Cache-Tags'])); $this->assertFalse(isset($headers['X-Drupal-Cache-Max-Age'])); // 5. controller result: CacheableResponse object, globally cacheable route access. $this->drupalGet('router_test/test21'); $headers = $session->getResponseHeaders(); Loading @@ -100,6 +104,7 @@ public function testFinishResponseSubscriber() { $headers = $session->getResponseHeaders(); $this->assertTrue(isset($headers['X-Drupal-Cache-Contexts'])); $this->assertTrue(isset($headers['X-Drupal-Cache-Tags'])); $this->assertTrue(isset($headers['X-Drupal-Cache-Max-Age'])); $this->setContainerParameter('http.response.debug_cacheability_headers', FALSE); $this->rebuildContainer(); $this->resetAll(); Loading @@ -107,6 +112,7 @@ public function testFinishResponseSubscriber() { $headers = $session->getResponseHeaders(); $this->assertFalse(isset($headers['X-Drupal-Cache-Contexts'])); $this->assertFalse(isset($headers['X-Drupal-Cache-Tags'])); $this->assertFalse(isset($headers['X-Drupal-Cache-Max-Age'])); } /** Loading sites/default/default.services.yml +2 −1 Original line number Diff line number Diff line Loading @@ -118,7 +118,8 @@ parameters: # Cacheability debugging: # # Responses with cacheability metadata (CacheableResponseInterface instances) # get X-Drupal-Cache-Tags and X-Drupal-Cache-Contexts headers. # get X-Drupal-Cache-Tags, X-Drupal-Cache-Contexts and X-Drupal-Cache-Max-Age # headers. # # For more information about debugging cacheable responses, see # https://www.drupal.org/developing/api/8/response/cacheable-response-interface Loading Loading
core/assets/scaffold/files/default.services.yml +2 −1 Original line number Diff line number Diff line Loading @@ -118,7 +118,8 @@ parameters: # Cacheability debugging: # # Responses with cacheability metadata (CacheableResponseInterface instances) # get X-Drupal-Cache-Tags and X-Drupal-Cache-Contexts headers. # get X-Drupal-Cache-Tags, X-Drupal-Cache-Contexts and X-Drupal-Cache-Max-Age # headers. # # For more information about debugging cacheable responses, see # https://www.drupal.org/developing/api/8/response/cacheable-response-interface Loading
core/lib/Drupal/Core/EventSubscriber/FinishResponseSubscriber.php +8 −0 Original line number Diff line number Diff line Loading @@ -156,6 +156,14 @@ public function onRespond(ResponseEvent $event) { $response_cacheability = $response->getCacheableMetadata(); $response->headers->set('X-Drupal-Cache-Tags', implode(' ', $response_cacheability->getCacheTags())); $response->headers->set('X-Drupal-Cache-Contexts', implode(' ', $this->cacheContextsManager->optimizeTokens($response_cacheability->getCacheContexts()))); $max_age_message = $response_cacheability->getCacheMaxAge(); if ($max_age_message === 0) { $max_age_message = '0 (Uncacheable)'; } elseif ($max_age_message === -1) { $max_age_message = '-1 (Permanent)'; } $response->headers->set('X-Drupal-Cache-Max-Age', $max_age_message); } $is_cacheable = ($this->requestPolicy->check($request) === RequestPolicyInterface::ALLOW) && ($this->responsePolicy->check($response, $request) !== ResponsePolicyInterface::DENY); Loading
core/modules/system/tests/src/Functional/Routing/RouterTest.php +6 −0 Original line number Diff line number Diff line Loading @@ -54,6 +54,7 @@ public function testFinishResponseSubscriber() { $headers = $session->getResponseHeaders(); $this->assertEqual($headers['X-Drupal-Cache-Contexts'], [implode(' ', $expected_cache_contexts)]); $this->assertEqual($headers['X-Drupal-Cache-Tags'], ['config:user.role.anonymous http_response rendered']); $this->assertEqual($headers['X-Drupal-Cache-Max-Age'], ['-1 (Permanent)']); // Confirm that the page wrapping is being added, so we're not getting a // raw body returned. $this->assertRaw('</html>', 'Page markup was found.'); Loading @@ -68,6 +69,7 @@ public function testFinishResponseSubscriber() { $headers = $session->getResponseHeaders(); $this->assertEqual($headers['X-Drupal-Cache-Contexts'], [implode(' ', Cache::mergeContexts($renderer_required_cache_contexts, ['url']))]); $this->assertEqual($headers['X-Drupal-Cache-Tags'], ['config:user.role.anonymous foo http_response rendered']); $this->assertEqual($headers['X-Drupal-Cache-Max-Age'], ['60']); // 2. controller result: render array, per-role cacheable route access. $this->drupalGet('router_test/test19'); $headers = $session->getResponseHeaders(); Loading @@ -78,11 +80,13 @@ public function testFinishResponseSubscriber() { $headers = $session->getResponseHeaders(); $this->assertFalse(isset($headers['X-Drupal-Cache-Contexts'])); $this->assertFalse(isset($headers['X-Drupal-Cache-Tags'])); $this->assertFalse(isset($headers['X-Drupal-Cache-Max-Age'])); // 4. controller result: Response object, per-role cacheable route access. $this->drupalGet('router_test/test20'); $headers = $session->getResponseHeaders(); $this->assertFalse(isset($headers['X-Drupal-Cache-Contexts'])); $this->assertFalse(isset($headers['X-Drupal-Cache-Tags'])); $this->assertFalse(isset($headers['X-Drupal-Cache-Max-Age'])); // 5. controller result: CacheableResponse object, globally cacheable route access. $this->drupalGet('router_test/test21'); $headers = $session->getResponseHeaders(); Loading @@ -100,6 +104,7 @@ public function testFinishResponseSubscriber() { $headers = $session->getResponseHeaders(); $this->assertTrue(isset($headers['X-Drupal-Cache-Contexts'])); $this->assertTrue(isset($headers['X-Drupal-Cache-Tags'])); $this->assertTrue(isset($headers['X-Drupal-Cache-Max-Age'])); $this->setContainerParameter('http.response.debug_cacheability_headers', FALSE); $this->rebuildContainer(); $this->resetAll(); Loading @@ -107,6 +112,7 @@ public function testFinishResponseSubscriber() { $headers = $session->getResponseHeaders(); $this->assertFalse(isset($headers['X-Drupal-Cache-Contexts'])); $this->assertFalse(isset($headers['X-Drupal-Cache-Tags'])); $this->assertFalse(isset($headers['X-Drupal-Cache-Max-Age'])); } /** Loading
sites/default/default.services.yml +2 −1 Original line number Diff line number Diff line Loading @@ -118,7 +118,8 @@ parameters: # Cacheability debugging: # # Responses with cacheability metadata (CacheableResponseInterface instances) # get X-Drupal-Cache-Tags and X-Drupal-Cache-Contexts headers. # get X-Drupal-Cache-Tags, X-Drupal-Cache-Contexts and X-Drupal-Cache-Max-Age # headers. # # For more information about debugging cacheable responses, see # https://www.drupal.org/developing/api/8/response/cacheable-response-interface Loading