Issue #2471473 by klausi, pwolanin: REST responses should have proper cache tags
parent
ee12606d08
commit
bf9a2f39fc
|
@ -54,7 +54,8 @@ class EntityResource extends ResourceBase {
|
||||||
unset($entity->{$field_name});
|
unset($entity->{$field_name});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return new ResourceResponse($entity);
|
|
||||||
|
return new ResourceResponse($entity, 200, ['X-Drupal-Cache-Tags' => implode(' ', $entity->getCacheTags())]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
|
|
||||||
namespace Drupal\rest;
|
namespace Drupal\rest;
|
||||||
|
|
||||||
|
use Drupal\Core\Cache\Cache;
|
||||||
use Drupal\Core\Routing\RouteMatchInterface;
|
use Drupal\Core\Routing\RouteMatchInterface;
|
||||||
use Symfony\Component\DependencyInjection\ContainerAwareInterface;
|
use Symfony\Component\DependencyInjection\ContainerAwareInterface;
|
||||||
use Symfony\Component\DependencyInjection\ContainerAwareTrait;
|
use Symfony\Component\DependencyInjection\ContainerAwareTrait;
|
||||||
|
@ -108,6 +109,14 @@ class RequestHandler implements ContainerAwareInterface {
|
||||||
$output = $serializer->serialize($data, $format);
|
$output = $serializer->serialize($data, $format);
|
||||||
$response->setContent($output);
|
$response->setContent($output);
|
||||||
$response->headers->set('Content-Type', $request->getMimeType($format));
|
$response->headers->set('Content-Type', $request->getMimeType($format));
|
||||||
|
// Add cache tags, but do not overwrite any that exist already on the
|
||||||
|
// response object.
|
||||||
|
$cache_tags = $this->container->get('config.factory')->get('rest.settings')->getCacheTags();
|
||||||
|
if ($response->headers->has('X-Drupal-Cache-Tags')) {
|
||||||
|
$existing_cache_tags = explode(' ', $response->headers->get('X-Drupal-Cache-Tags'));
|
||||||
|
$cache_tags = Cache::mergeTags($existing_cache_tags, $cache_tags);
|
||||||
|
}
|
||||||
|
$response->headers->set('X-Drupal-Cache-Tags', implode(' ', $cache_tags));
|
||||||
}
|
}
|
||||||
return $response;
|
return $response;
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,61 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file
|
||||||
|
* Contains Drupal\rest\test\PageCacheTest.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Drupal\rest\Tests;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests page caching for REST GET requests.
|
||||||
|
*
|
||||||
|
* @group rest
|
||||||
|
*/
|
||||||
|
class PageCacheTest extends RESTTestBase {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Modules to install.
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
public static $modules = array('hal', 'rest', 'entity_test');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests that configuration changes also clear the page cache.
|
||||||
|
*/
|
||||||
|
public function testConfigChangePageCache() {
|
||||||
|
$this->enableService('entity:entity_test', 'GET');
|
||||||
|
// Allow anonymous users to issue GET requests.
|
||||||
|
$permissions = $this->entityPermissions('entity_test', 'view');
|
||||||
|
$permissions[] = 'restful get entity:entity_test';
|
||||||
|
user_role_grant_permissions('anonymous', $permissions);
|
||||||
|
|
||||||
|
// Create an entity programmatically.
|
||||||
|
$entity = $this->entityCreate('entity_test');
|
||||||
|
$entity->save();
|
||||||
|
// Read it over the REST API.
|
||||||
|
$this->httpRequest($entity->urlInfo(), 'GET', NULL, $this->defaultMimeType);
|
||||||
|
$this->assertResponse(200, 'HTTP response code is correct.');
|
||||||
|
$this->assertHeader('x-drupal-cache', 'MISS');
|
||||||
|
$this->assertCacheTag('config:rest.settings');
|
||||||
|
$this->assertCacheTag('entity_test:1');
|
||||||
|
|
||||||
|
// Read it again, should be page-cached now.
|
||||||
|
$this->httpRequest($entity->urlInfo(), 'GET', NULL, $this->defaultMimeType);
|
||||||
|
$this->assertResponse(200, 'HTTP response code is correct.');
|
||||||
|
$this->assertHeader('x-drupal-cache', 'HIT');
|
||||||
|
$this->assertCacheTag('config:rest.settings');
|
||||||
|
$this->assertCacheTag('entity_test:1');
|
||||||
|
|
||||||
|
// Trigger a config save which should clear the page cache, so we should get
|
||||||
|
// a cache miss now for the same request.
|
||||||
|
$this->config('rest.settings')->save();
|
||||||
|
$this->httpRequest($entity->urlInfo(), 'GET', NULL, $this->defaultMimeType);
|
||||||
|
$this->assertResponse(200, 'HTTP response code is correct.');
|
||||||
|
$this->assertHeader('x-drupal-cache', 'MISS');
|
||||||
|
$this->assertCacheTag('config:rest.settings');
|
||||||
|
$this->assertCacheTag('entity_test:1');
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -154,12 +154,15 @@ abstract class RESTTestBase extends WebTestBase {
|
||||||
}
|
}
|
||||||
|
|
||||||
$response = $this->curlExec($curl_options);
|
$response = $this->curlExec($curl_options);
|
||||||
|
|
||||||
|
// Ensure that any changes to variables in the other thread are picked up.
|
||||||
|
$this->refreshVariables();
|
||||||
|
|
||||||
$headers = $this->drupalGetHeaders();
|
$headers = $this->drupalGetHeaders();
|
||||||
$headers = implode("\n", $headers);
|
|
||||||
|
|
||||||
$this->verbose($method . ' request to: ' . $url .
|
$this->verbose($method . ' request to: ' . $url .
|
||||||
'<hr />Code: ' . curl_getinfo($this->curlHandle, CURLINFO_HTTP_CODE) .
|
'<hr />Code: ' . curl_getinfo($this->curlHandle, CURLINFO_HTTP_CODE) .
|
||||||
'<hr />Response headers: ' . $headers .
|
'<hr />Response headers: ' . nl2br(print_r($headers, TRUE)) .
|
||||||
'<hr />Response body: ' . $response);
|
'<hr />Response body: ' . $response);
|
||||||
|
|
||||||
return $response;
|
return $response;
|
||||||
|
|
Loading…
Reference in New Issue