From c6196ff450496b9eba631d7a6a5bd43d3091ad59 Mon Sep 17 00:00:00 2001 From: Thomas Gelf Date: Tue, 1 Mar 2016 11:24:24 +0100 Subject: [PATCH] ObjectController: beautify REST API response codes It doesn't hurt when the code matches the documentation ;) --- .../Web/Controller/ObjectController.php | 28 ++++++++++++++----- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/library/Director/Web/Controller/ObjectController.php b/library/Director/Web/Controller/ObjectController.php index edebafe7..5b8b35d2 100644 --- a/library/Director/Web/Controller/ObjectController.php +++ b/library/Director/Web/Controller/ObjectController.php @@ -3,9 +3,10 @@ namespace Icinga\Module\Director\Web\Controller; use Exception; +use Icinga\Exception\IcingaException; use Icinga\Exception\NotFoundError; -use Icinga\Web\Url; use Icinga\Module\Director\Objects\IcingaObject; +use Icinga\Web\Url; abstract class ObjectController extends ActionController { @@ -64,6 +65,11 @@ abstract class ObjectController extends ActionController try { return $this->handleApiRequest(); } catch (Exception $e) { + $response = $this->getResponse(); + if ($response->getHttpResponseCode() === 200) { + $response->setHttpResponseCode(500); + } + return $this->sendJson((object) array('error' => $e->getMessage())); } } @@ -283,7 +289,17 @@ abstract class ObjectController extends ActionController case 'POST': case 'PUT': $type = $this->getType(); - $data = (array) json_decode($request->getRawBody()); + $data = json_decode($request->getRawBody()); + + if ($data === null) { + $this->getResponse()->setHttpResponseCode(400); + throw new IcingaException( + 'Invalid JSON: %s' . $request->getRawBody(), + $this->getLastJsonError() + ); + } else { + $data = (array) $data; + } if ($object = $this->object) { if ($request->getMethod() === 'POST') { $object->setProperties($data); @@ -305,12 +321,9 @@ abstract class ObjectController extends ActionController $response = $this->getResponse(); if ($object->hasBeenModified()) { + $status = $object->hasBeenLoadedFromDb() ? 200 : 201; $object->store(); - if ($object->hasBeenLoadedFromDb()) { - $response->setHttpResponseCode(200); - } else { - $response->setHttpResponseCode(201); - } + $response->setHttpResponseCode($status); } else { $response->setHttpResponseCode(304); } @@ -328,6 +341,7 @@ abstract class ObjectController extends ActionController ); default: + $request->getResponse()->setHttpResponseCode(400); throw new Exception('Unsupported method ' . $request->getMethod()); } }