Skip to content
Snippets Groups Projects
Commit a5b62885 authored by catch's avatar catch
Browse files

Issue #3093973 by robindh, Diego_Mow, smustgrave, Grayle: Allow DELETE...

Issue #3093973 by robindh, Diego_Mow, smustgrave, Grayle: Allow DELETE requests to return a response body
parent 98217b5b
Branches
Tags
25 merge requests!54479.5.x SF update,!5014Issue #3071143: Table Render Array Example Is Incorrect,!4868Issue #1428520: Improve menu parent link selection,!4289Issue #1344552 by marcingy, Niklas Fiekas, Ravi.J, aleevas, Eduardo Morales...,!4114Issue #2707291: Disable body-level scrolling when a dialog is open as a modal,!4100Issue #3249600: Add support for PHP 8.1 Enums as allowed values for list_* data types,!2378Issue #2875033: Optimize joins and table selection in SQL entity query implementation,!2334Issue #3228209: Add hasRole() method to AccountInterface,!2062Issue #3246454: Add weekly granularity to views date sort,!1591Issue #3199697: Add JSON:API Translation experimental module,!1484Exposed filters get values from URL when Ajax is on,!1255Issue #3238922: Refactor (if feasible) uses of the jQuery serialize function to use vanillaJS,!1105Issue #3025039: New non translatable field on translatable content throws error,!1073issue #3191727: Focus states on mobile second level navigation items fixed,!10223132456: Fix issue where views instances are emptied before an ajax request is complete,!925Issue #2339235: Remove taxonomy hard dependency on node module,!877Issue #2708101: Default value for link text is not saved,!872Draft: Issue #3221319: Race condition when creating menu links and editing content deletes menu links,!844Resolve #3036010 "Updaters",!617Issue #3043725: Provide a Entity Handler for user cancelation,!579Issue #2230909: Simple decimals fail to pass validation,!560Move callback classRemove outside of the loop,!555Issue #3202493,!485Sets the autocomplete attribute for username/password input field on login form.,!30Issue #3182188: Updates composer usage to point at ./vendor/bin/composer
...@@ -122,7 +122,7 @@ public function getResponseFormat(RouteMatchInterface $route_match, Request $req ...@@ -122,7 +122,7 @@ public function getResponseFormat(RouteMatchInterface $route_match, Request $req
return $acceptable_formats[0]; return $acceptable_formats[0];
} }
// Sometimes, there are no acceptable formats, e.g. DELETE routes. // Sometimes, there are no acceptable formats.
return NULL; return NULL;
} }
...@@ -141,8 +141,7 @@ public function getResponseFormat(RouteMatchInterface $route_match, Request $req ...@@ -141,8 +141,7 @@ public function getResponseFormat(RouteMatchInterface $route_match, Request $req
* @param \Symfony\Component\Serializer\SerializerInterface $serializer * @param \Symfony\Component\Serializer\SerializerInterface $serializer
* The serializer to use. * The serializer to use.
* @param string|null $format * @param string|null $format
* The response format, or NULL in case the response does not need a format, * The response format, or NULL in case the response does not need a format.
* for example for the response to a DELETE request.
* *
* @todo Add test coverage for language negotiation contexts in * @todo Add test coverage for language negotiation contexts in
* https://www.drupal.org/node/2135829. * https://www.drupal.org/node/2135829.
......
...@@ -116,7 +116,7 @@ protected function getRoutesForResourceConfig(RestResourceConfigInterface $rest_ ...@@ -116,7 +116,7 @@ protected function getRoutesForResourceConfig(RestResourceConfigInterface $rest_
// - set the allowed request body content types/formats for methods that // - set the allowed request body content types/formats for methods that
// allow request bodies to be sent (unless hardcoded by the plugin) // allow request bodies to be sent (unless hardcoded by the plugin)
// - set the allowed authentication providers // - set the allowed authentication providers
if (in_array($method, ['GET', 'HEAD', 'POST', 'PUT', 'PATCH'], TRUE) && !$route->hasRequirement('_format')) { if (in_array($method, ['GET', 'HEAD', 'POST', 'PUT', 'PATCH', 'DELETE'], TRUE) && !$route->hasRequirement('_format')) {
$route->addRequirements(['_format' => implode('|', $rest_resource_config->getFormats($method))]); $route->addRequirements(['_format' => implode('|', $rest_resource_config->getFormats($method))]);
} }
if (in_array($method, ['POST', 'PATCH', 'PUT'], TRUE) && !$route->hasRequirement('_content_type_format')) { if (in_array($method, ['POST', 'PATCH', 'PUT'], TRUE) && !$route->hasRequirement('_content_type_format')) {
......
...@@ -136,7 +136,7 @@ public function testOnResponseWithCacheableResponse($methods, array $supported_r ...@@ -136,7 +136,7 @@ public function testOnResponseWithCacheableResponse($methods, array $supported_r
$route_match = new RouteMatch('test', new Route('/rest/test', ['_rest_resource_config' => $this->randomMachineName()], $route_requirements)); $route_match = new RouteMatch('test', new Route('/rest/test', ['_rest_resource_config' => $this->randomMachineName()], $route_requirements));
// The RequestHandler must return a ResourceResponseInterface object. // The RequestHandler must return a ResourceResponseInterface object.
$handler_response = new ResourceResponse($method !== 'DELETE' ? ['REST' => 'Drupal'] : NULL); $handler_response = new ResourceResponse(['REST' => 'Drupal']);
$this->assertInstanceOf(ResourceResponseInterface::class, $handler_response); $this->assertInstanceOf(ResourceResponseInterface::class, $handler_response);
$this->assertInstanceOf(CacheableResponseInterface::class, $handler_response); $this->assertInstanceOf(CacheableResponseInterface::class, $handler_response);
...@@ -186,7 +186,7 @@ public function testOnResponseWithUncacheableResponse($methods, array $supported ...@@ -186,7 +186,7 @@ public function testOnResponseWithUncacheableResponse($methods, array $supported
$route_match = new RouteMatch('test', new Route('/rest/test', ['_rest_resource_config' => $this->randomMachineName()], $route_requirements)); $route_match = new RouteMatch('test', new Route('/rest/test', ['_rest_resource_config' => $this->randomMachineName()], $route_requirements));
// The RequestHandler must return a ResourceResponseInterface object. // The RequestHandler must return a ResourceResponseInterface object.
$handler_response = new ModifiedResourceResponse($method !== 'DELETE' ? ['REST' => 'Drupal'] : NULL); $handler_response = new ModifiedResourceResponse(['REST' => 'Drupal']);
$this->assertInstanceOf(ResourceResponseInterface::class, $handler_response); $this->assertInstanceOf(ResourceResponseInterface::class, $handler_response);
$this->assertNotInstanceOf(CacheableResponseInterface::class, $handler_response); $this->assertNotInstanceOf(CacheableResponseInterface::class, $handler_response);
...@@ -344,7 +344,7 @@ public function providerTestResponseFormat() { ...@@ -344,7 +344,7 @@ public function providerTestResponseFormat() {
]; ];
$unsafe_method_bodyless_test_cases = [ $unsafe_method_bodyless_test_cases = [
'unsafe methods without response bodies (DELETE): client requested no format, response should have no format' => [ 'unsafe methods without request bodies (DELETE): client requested no format, response should have the first acceptable format' => [
['DELETE'], ['DELETE'],
['xml', 'json'], ['xml', 'json'],
['xml', 'json'], ['xml', 'json'],
...@@ -352,10 +352,10 @@ public function providerTestResponseFormat() { ...@@ -352,10 +352,10 @@ public function providerTestResponseFormat() {
['Content-Type' => 'application/json'], ['Content-Type' => 'application/json'],
NULL, NULL,
'xml', 'xml',
NULL, 'text/xml',
'', $xml_encoded,
], ],
'unsafe methods without response bodies (DELETE): client requested format (XML), response should have no format' => [ 'unsafe methods without request bodies (DELETE): client requested format (XML), response should have xml format' => [
['DELETE'], ['DELETE'],
['xml', 'json'], ['xml', 'json'],
['xml', 'json'], ['xml', 'json'],
...@@ -363,10 +363,10 @@ public function providerTestResponseFormat() { ...@@ -363,10 +363,10 @@ public function providerTestResponseFormat() {
['Content-Type' => 'application/json'], ['Content-Type' => 'application/json'],
NULL, NULL,
'xml', 'xml',
NULL, 'text/xml',
'', $xml_encoded,
], ],
'unsafe methods without response bodies (DELETE): client requested format (JSON), response should have no format' => [ 'unsafe methods without request bodies (DELETE): client requested format (JSON), response should have json format' => [
['DELETE'], ['DELETE'],
['xml', 'json'], ['xml', 'json'],
['xml', 'json'], ['xml', 'json'],
...@@ -374,8 +374,8 @@ public function providerTestResponseFormat() { ...@@ -374,8 +374,8 @@ public function providerTestResponseFormat() {
['Content-Type' => 'application/json'], ['Content-Type' => 'application/json'],
NULL, NULL,
'json', 'json',
NULL, 'application/json',
'', $json_encoded,
], ],
]; ];
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment