summaryrefslogtreecommitdiffstats
path: root/system
diff options
context:
space:
mode:
authorDerek Jones <derek.jones@ellislab.com>2009-07-11 19:05:58 +0200
committerDerek Jones <derek.jones@ellislab.com>2009-07-11 19:05:58 +0200
commit817163a1bcff02285f763bcf72ff02e86f218cf8 (patch)
treeca429f1c3b2acc8d72e97e6269ca3cdb5598f95b /system
parent55acc8b4d980c43e4bde04f0e0b99a594dea28ff (diff)
Modified show_error() to allow sending of HTTP server response codes.
Added set_status_header() to the Common functions to allow use when the Output class is unavailable. Fixed a bug where the 400 status header sent with the 'disallowed URI characters' was not compatible with CGI environments.
Diffstat (limited to 'system')
-rw-r--r--system/codeigniter/Common.php89
-rw-r--r--system/libraries/Exceptions.php4
-rw-r--r--system/libraries/Output.php75
-rw-r--r--system/libraries/URI.php3
4 files changed, 94 insertions, 77 deletions
diff --git a/system/codeigniter/Common.php b/system/codeigniter/Common.php
index c7f95688f..340be2454 100644
--- a/system/codeigniter/Common.php
+++ b/system/codeigniter/Common.php
@@ -203,10 +203,10 @@ function config_item($item)
* @access public
* @return void
*/
-function show_error($message)
+function show_error($message, $status_code = 500)
{
$error =& load_class('Exceptions');
- echo $error->show_error('An Error Was Encountered', $message);
+ echo $error->show_error('An Error Was Encountered', $message, 'error_general', $status_code);
exit;
}
@@ -252,6 +252,91 @@ function log_message($level = 'error', $message, $php_error = FALSE)
$LOG->write_log($level, $message, $php_error);
}
+
+/**
+ * Set HTTP Status Header
+ *
+ * @access public
+ * @param int the status code
+ * @param string
+ * @return void
+ */
+function set_status_header($code = 200, $text = '')
+{
+ $stati = array(
+ 200 => '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',
+ 304 => 'Not Modified',
+ 305 => 'Use Proxy',
+ 307 => 'Temporary Redirect',
+
+ 400 => 'Bad Request',
+ 401 => 'Unauthorized',
+ 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'
+ );
+
+ if ($code == '' OR ! is_numeric($code))
+ {
+ show_error('Status codes must be numeric', 500);
+ }
+
+ if (isset($stati[$code]) AND $text == '')
+ {
+ $text = $stati[$code];
+ }
+
+ if ($text == '')
+ {
+ show_error('No status text available. Please check your status code number or supply your own message text.', 500);
+ }
+
+ $server_protocol = (isset($_SERVER['SERVER_PROTOCOL'])) ? $_SERVER['SERVER_PROTOCOL'] : FALSE;
+
+ if (substr(php_sapi_name(), 0, 3) == 'cgi')
+ {
+ header("Status: {$code} {$text}", TRUE);
+ }
+ elseif ($server_protocol == 'HTTP/1.1' OR $server_protocol == 'HTTP/1.0')
+ {
+ header($server_protocol." {$code} {$text}", TRUE, $code);
+ }
+ else
+ {
+ header("HTTP/1.1 {$code} {$text}", TRUE, $code);
+ }
+}
+
+
/**
* Exception Handler
*
diff --git a/system/libraries/Exceptions.php b/system/libraries/Exceptions.php
index 902b574fc..1f99d01c3 100644
--- a/system/libraries/Exceptions.php
+++ b/system/libraries/Exceptions.php
@@ -113,8 +113,10 @@ class CI_Exceptions {
* @param string the template name
* @return string
*/
- function show_error($heading, $message, $template = 'error_general')
+ function show_error($heading, $message, $template = 'error_general', $status_code = 500)
{
+ set_status_header($status_code);
+
$message = '<p>'.implode('</p><p>', ( ! is_array($message)) ? array($message) : $message).'</p>';
if (ob_get_level() > $this->ob_level + 1)
diff --git a/system/libraries/Output.php b/system/libraries/Output.php
index 6bfb9c7eb..4423ac726 100644
--- a/system/libraries/Output.php
+++ b/system/libraries/Output.php
@@ -116,7 +116,8 @@ class CI_Output {
/**
* Set HTTP Status Header
- *
+ * moved to Common procedural functions in 1.7.2
+ *
* @access public
* @param int the status code
* @param string
@@ -124,77 +125,7 @@ class CI_Output {
*/
function set_status_header($code = '200', $text = '')
{
- $stati = array(
- '200' => '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',
- '304' => 'Not Modified',
- '305' => 'Use Proxy',
- '307' => 'Temporary Redirect',
-
- '400' => 'Bad Request',
- '401' => 'Unauthorized',
- '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'
- );
-
- if ($code == '' OR ! is_numeric($code))
- {
- show_error('Status codes must be numeric');
- }
-
- if (isset($stati[$code]) AND $text == '')
- {
- $text = $stati[$code];
- }
-
- if ($text == '')
- {
- show_error('No status text available. Please check your status code number or supply your own message text.');
- }
-
- $server_protocol = (isset($_SERVER['SERVER_PROTOCOL'])) ? $_SERVER['SERVER_PROTOCOL'] : FALSE;
-
- if (substr(php_sapi_name(), 0, 3) == 'cgi')
- {
- header("Status: {$code} {$text}", TRUE);
- }
- elseif ($server_protocol == 'HTTP/1.1' OR $server_protocol == 'HTTP/1.0')
- {
- header($server_protocol." {$code} {$text}", TRUE, $code);
- }
- else
- {
- header("HTTP/1.1 {$code} {$text}", TRUE, $code);
- }
+ set_status_header($code, $text);
}
// --------------------------------------------------------------------
diff --git a/system/libraries/URI.php b/system/libraries/URI.php
index f09a5cd7c..efc7a18b3 100644
--- a/system/libraries/URI.php
+++ b/system/libraries/URI.php
@@ -188,8 +188,7 @@ class CI_URI {
{
if ( ! preg_match("|^[".preg_quote($this->config->item('permitted_uri_chars'))."]+$|i", $str))
{
- header('HTTP/1.1 400 Bad Request');
- show_error('The URI you submitted has disallowed characters.');
+ show_error('The URI you submitted has disallowed characters.', 400);
}
}