From 79dd7fe9704b3ddf0ef674567e60aa45c0b35476 Mon Sep 17 00:00:00 2001 From: Seamus Lee Date: Fri, 7 Jun 2019 08:37:10 +1000 Subject: [PATCH] Move content of returning response into CRM_Utils_System and have user_system based method to set HTTP Status code --- CRM/Utils/System.php | 17 +++++++++++++++++ CRM/Utils/System/Base.php | 14 ++++++++++++++ CRM/Utils/System/WordPress.php | 15 +++++++++++++++ Civi/Core/AssetBuilder.php | 12 +----------- 4 files changed, 47 insertions(+), 11 deletions(-) diff --git a/CRM/Utils/System.php b/CRM/Utils/System.php index cdb2903836..0c3e316219 100644 --- a/CRM/Utils/System.php +++ b/CRM/Utils/System.php @@ -53,6 +53,7 @@ * @method static array synchronizeUsers() Create CRM contacts for all existing CMS users. * @method static appendCoreResources(\Civi\Core\Event\GenericHookEvent $e) Callback for hook_civicrm_coreResourceList. * @method static alterAssetUrl(\Civi\Core\Event\GenericHookEvent $e) Callback for hook_civicrm_getAssetUrl. + * @method static sendResponse(array $responseData) function to set HTTP status response and return specific response to client initially for assetBuilder content. */ class CRM_Utils_System { @@ -1861,4 +1862,20 @@ class CRM_Utils_System { return NULL; } + /** + * Return an HTTP Response with appropriate content and status code set. + * @param array $responseData + */ + public static function sendResponse($responseData) { + $config = CRM_Core_Config::singleton(); + if (!empty($responseData['statusCode'])) { + $config->userSystem->setStatusCode($responseData['statusCode']); + } + if (!empty($responseData['mimeType'])) { + self::setHttpHeader('Content-Type', $responseData['mimeType']); + } + echo $responseData['content']; + self::civiExit(); + } + } diff --git a/CRM/Utils/System/Base.php b/CRM/Utils/System/Base.php index 8642f53fbe..654463b40a 100644 --- a/CRM/Utils/System/Base.php +++ b/CRM/Utils/System/Base.php @@ -945,4 +945,18 @@ abstract class CRM_Utils_System_Base { return []; } + /** + * Set the HTTP Status Code for a request + * @param string $statusCode + */ + public function setStatusCode($statusCode) { + if (function_exists('http_response_code')) { + // PHP 5.4+ + http_response_code($statusCode); + } + else { + header('X-PHP-Response-Code: ' . $statusCode, TRUE, $statusCode); + } + } + } diff --git a/CRM/Utils/System/WordPress.php b/CRM/Utils/System/WordPress.php index 2a13781180..84cba04f88 100644 --- a/CRM/Utils/System/WordPress.php +++ b/CRM/Utils/System/WordPress.php @@ -863,4 +863,19 @@ class CRM_Utils_System_WordPress extends CRM_Utils_System_Base { ]; } + /** + * Set the HTTP Status Code for a request + * @param string $statusCode + */ + public function setStatusCode($statusCode) { + status_header($statusCode); + if (function_exists('http_response_code')) { + // PHP 5.4+ + http_response_code($statusCode); + } + else { + header('X-PHP-Response-Code: ' . $statusCode, TRUE, $statusCode); + } + } + } diff --git a/Civi/Core/AssetBuilder.php b/Civi/Core/AssetBuilder.php index a53be59402..f52b2653fd 100644 --- a/Civi/Core/AssetBuilder.php +++ b/Civi/Core/AssetBuilder.php @@ -342,17 +342,7 @@ class AssetBuilder { public static function pageRun() { // Beg your pardon, sir. Please may I have an HTTP response class instead? $asset = self::pageRender($_GET); - if (function_exists('http_response_code')) { - // PHP 5.4+ - http_response_code($asset['statusCode']); - } - else { - header('X-PHP-Response-Code: ' . $asset['statusCode'], TRUE, $asset['statusCode']); - } - - header('Content-Type: ' . $asset['mimeType']); - echo $asset['content']; - \CRM_Utils_System::civiExit(); + \CRM_Utils_System::sendResponse($asset); } /** -- 2.25.1