diff --git a/classes/display/DisplayHandler.class.php b/classes/display/DisplayHandler.class.php index f26c57c23..0327211b9 100644 --- a/classes/display/DisplayHandler.class.php +++ b/classes/display/DisplayHandler.class.php @@ -49,28 +49,35 @@ } $output = $handler->toDoc($oModule); - // call a trigger before display - ModuleHandler::triggerCall('display', 'before', $output); - // execute add-on - $called_position = 'before_display_content'; - $oAddonController = &getController('addon'); - $addon_file = $oAddonController->getCacheFilePath(Mobile::isFromMobilePhone()?"mobile":"pc"); - @include($addon_file); + // call a trigger before display + ModuleHandler::triggerCall('display', 'before', $output); + // execute add-on + $called_position = 'before_display_content'; + $oAddonController = &getController('addon'); + $addon_file = $oAddonController->getCacheFilePath(Mobile::isFromMobilePhone()?"mobile":"pc"); + @include($addon_file); if(method_exists($handler, "prepareToPrint")) $handler->prepareToPrint($output); - // header output - if($this->gz_enabled) header("Content-Encoding: gzip"); - if(Context::getResponseMethod() == 'JSON') $this->_printJSONHeader(); - else if(Context::getResponseMethod() != 'HTML') $this->_printXMLHeader(); - else $this->_printHTMLHeader(); - // debugOutput output - $this->content_size = strlen($output); - $output .= $this->_debugOutput(); - // results directly output - if($this->gz_enabled) print ob_gzhandler($output, 5); - else print $output; - // call a trigger after display - ModuleHandler::triggerCall('display', 'after', $content); + // header output + if($this->gz_enabled) header("Content-Encoding: gzip"); + + $httpStatusCode = $oModule->getHttpStatusCode(); + if($httpStatusCode && $httpStatusCode != 200) $this->_printHttpStatusCode($httpStatusCode); + else + { + if(Context::getResponseMethod() == 'JSON') $this->_printJSONHeader(); + else if(Context::getResponseMethod() != 'HTML') $this->_printXMLHeader(); + else $this->_printHTMLHeader(); + } + + // debugOutput output + $this->content_size = strlen($output); + $output .= $this->_debugOutput(); + // results directly output + if($this->gz_enabled) print ob_gzhandler($output, 5); + else print $output; + // call a trigger after display + ModuleHandler::triggerCall('display', 'after', $content); } @@ -252,7 +259,12 @@ } - - + /** + * @brief print a HTTP HEADER for HTML, which is encoded in UTF-8 + **/ + function _printHttpStatusCode($code) { + $statusMessage = Context::get('http_status_message'); + header("HTTP/1.0 $code $statusMessage"); + } } ?> diff --git a/classes/module/ModuleHandler.class.php b/classes/module/ModuleHandler.class.php index ab9f932fc..a5ca47845 100644 --- a/classes/module/ModuleHandler.class.php +++ b/classes/module/ModuleHandler.class.php @@ -20,6 +20,7 @@ var $module_info = NULL; ///< Module Info. Object var $error = NULL; ///< an error code. + var $httpStatusCode = NULL; ///< http status code. /** * @brief constructor @@ -109,7 +110,7 @@ } // If module_info is not set still, and $module does not exist, find the default module - if(!$module_info && !$this->module) $module_info = $site_module_info; + if(!$module_info && !$this->module && !$this->mid) $module_info = $site_module_info; if(!$module_info && !$this->module && $site_module_info->module_site_srl) $module_info = $site_module_info; @@ -147,7 +148,11 @@ $this->module_info->site_srl = $site_module_info->site_srl; // Still no module? it's an error - if(!$this->module) $this->error = 'msg_module_does_not_exist'; + if(!$this->module) + { + $this->error = 'msg_module_does_not_exist'; + $this->httpStatusCode = '404'; + } // If mid exists, set mid into context if($this->mid) Context::set('mid', $this->mid, true); @@ -179,6 +184,10 @@ $oMessageObject->setError(-1); $oMessageObject->setMessage($this->error); $oMessageObject->dispMessage(); + if($this->httpStatusCode) + { + $oMessageObject->setHttpStatusCode($this->httpStatusCode); + } return $oMessageObject; } @@ -507,6 +516,12 @@ $oMessageObject->setMessage($this->error); $oMessageObject->dispMessage(); + if($oMessageObject->getHttpStatusCode() && $oMessageObject->getHttpStatusCode() != '200') + { + $this->_setHttpStatusMessage($oMessageObject->getHttpStatusCode()); + $oMessageObject->setTemplateFile('http_status_code'); + } + // If module was called normally, change the templates of the module into ones of the message view module if($oModule) { $oModule->setTemplatePath($oMessageObject->getTemplatePath()); @@ -705,5 +720,58 @@ return new Object(); } + + /** + * @brief get http status message by http status code + **/ + function _setHttpStatusMessage($code) { + $statusMessageList = array( + '100'=>'Continue', + '101'=>'Switching Protocols', + '201'=>'OK', + '201'=>'Created', + '202'=>'Accepted', + '203'=>'Non-Authoritative Information', + '204'=>'No Content', + '205'=>'Reset Content', + '206'=>'Partial Content', + '300'=>'Multiple Choices', + '301'=>'Moved Permanently', + '302'=>'Found', + '303'=>'See Other', + '304'=>'Not Modified', + '305'=>'Use Proxy', + '307'=>'Temporary Redirect', + '400'=>'Bad Request', + '401'=>'Unauthorized', + '402'=>'Payment Required', + '403'=>'Forbidden', + '404'=>'Not Found', + '405'=>'Method Not Allowed', + '406'=>'Not Acceptable', + '407'=>'Proxy Authentication Required', + '408'=>'Request Timeout', + '409'=>'Conflict', + '410'=>'Gone', + '411'=>'Length Required', + '412'=>'Precondition Failed', + '413'=>'Request Entity Too Large', + '414'=>'Request-URI Too Long', + '415'=>'Unsupported Media Type', + '416'=>'Requested Range Not Satisfiable', + '417'=>'Expectation Failed', + '500'=>'Internal Server Error', + '501'=>'Not Implemented', + '502'=>'Bad Gateway', + '503'=>'Service Unavailable', + '504'=>'Gateway Timeout', + '505'=>'HTTP Version Not Supported', + ); + $statusMessage = $statusMessageList[$code]; + if(!$statusMessage) $statusMessage = 'OK'; + + Context::set('http_status_code', $code); + Context::set('http_status_message', $statusMessage); + } } ?> diff --git a/classes/object/Object.class.php b/classes/object/Object.class.php index 0f65631ec..d2ec62298 100644 --- a/classes/object/Object.class.php +++ b/classes/object/Object.class.php @@ -13,6 +13,7 @@ var $message = 'success'; // / "Error message (if success, it is not an error) var $variables = array(); // /< an additional variable + var $httpStatusCode = NULL; ///< http status code. /** * @brief constructor @@ -37,6 +38,16 @@ return $this->error; } + function setHttpStatusCode($code = '200') + { + $this->httpStatusCode = $code; + } + + function getHttpStatusCode() + { + return $this->httpStatusCode; + } + /** * @brief Setter to set set the error message * @param[in] $message a messge string