summaryrefslogtreecommitdiffstats
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
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.
-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
-rw-r--r--user_guide/changelog.html7
-rw-r--r--user_guide/general/common_functions.html17
-rw-r--r--user_guide/general/errors.html3
-rw-r--r--user_guide/libraries/output.html2
8 files changed, 121 insertions, 79 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);
}
}
diff --git a/user_guide/changelog.html b/user_guide/changelog.html
index 323467b6e..e4199cd35 100644
--- a/user_guide/changelog.html
+++ b/user_guide/changelog.html
@@ -85,6 +85,12 @@ SVN Revision: </p>
<li>Modified <kbd>directory_map()</kbd> in the <a href="helpers/directory_helper.html">Directory helper</a> to allow the inclusion of hidden files.</li>
</ul>
</li>
+ <li>General
+ <ul>
+ <li>Modified <a href="general/errors.html">show_error()</a> to allow sending of HTTP server response codes.</li>
+ <li>Added set_status_header() to the <a href="general/common_functions.html">Common functions<a> to allow use when the Output class is unavailable.</li>
+ </ul>
+ </li>
</ul>
<h3>Bug fixes for 1.7.2</h3>
@@ -102,6 +108,7 @@ SVN Revision: </p>
<li>Fixed a case sensitive string replacement in xss_clean()</li>
<li>Fixed a bug in form_prep() causing it to not preserve entities in the user's original input when called back into a form element</li>
<li>Fixed a bug in _protect_identifiers() where the swap prefix ($swap_pre) was not being observed.</li>
+ <li>Fixed a bug where the 400 status header sent with the 'disallowed URI characters' was not compatible with CGI environments.</li>
</ul>
<h2>Version 1.7.1</h2>
diff --git a/user_guide/general/common_functions.html b/user_guide/general/common_functions.html
index df5dfea6e..980a5a969 100644
--- a/user_guide/general/common_functions.html
+++ b/user_guide/general/common_functions.html
@@ -58,8 +58,11 @@ Auto-loading Resources
<h1>Common Functions</h1>
<p>CodeIgniter uses a few functions for its operation that are globally defined, and are available to you at any point. These do not require loading any libraries or helpers.</p>
+
<h2>is_really_writable('<var>path/to/file</var>')</h2>
+
<p>is_writable() returns TRUE on Windows servers when you really can't write to the file as the OS reports to PHP as FALSE only if the read-only attribute is marked. This function determines if a file is actually writable by attempting to write to it first. Generally only recommended on platforms where this information may be unreliable.</p>
+
<code>if (is_really_writable('file.txt'))<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;echo &quot;I could write to this if I wanted to&quot;;<br />
@@ -68,11 +71,25 @@ else<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;echo &quot;File is not writable&quot;;<br />
}</code>
+
<h2>config_item('<var>item_key</var>')</h2>
<p>The <a href="../libraries/config.html">Config library</a> is the preferred way of accessing configuration information, however config_item() can be used to retrieve single keys. See Config library documentation for more information.</p>
+
<h2>show_error('<var>message</var>'), show_404('<var>page</var>'), log_message('<var>level</var>', '<samp>message</samp>')</h2>
<p>These are each outlined on the <a href="errors.html">Error Handling</a> page.</p>
+
+<h2>set_status_header(<var>code</var>, '<var>text</var>');</h2>
+
+<p>Permits you to manually set a server status header. Example:</p>
+
+<code>set_status_header(401);<br />
+// Sets the header as: Unauthorized</code>
+
+<p><a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html">See here</a> for a full list of headers.</p>
+
</div>
+
+
<!-- END CONTENT -->
diff --git a/user_guide/general/errors.html b/user_guide/general/errors.html
index c1bb69119..af1184593 100644
--- a/user_guide/general/errors.html
+++ b/user_guide/general/errors.html
@@ -71,9 +71,10 @@ about class/function scoping.</p>
<p>The following functions let you generate errors:</p>
-<h2>show_error('<var>message</var>')</h2>
+<h2>show_error('<var>message</var>' [, int <var>$status_code</var>= 500 ] )</h2>
<p>This function will display the error message supplied to it using the following error template:</p>
<p><dfn>application/errors/</dfn><kbd>error_general.php</kbd></p>
+<p>The optional parameter $status_code determines what HTTP status code should be sent with the error.</p>
<h2>show_404('<var>page</var>')</h2>
<p>This function will display the 404 error message supplied to it using the following error template:</p>
diff --git a/user_guide/libraries/output.html b/user_guide/libraries/output.html
index 6d75fe7b2..ba6a0d333 100644
--- a/user_guide/libraries/output.html
+++ b/user_guide/libraries/output.html
@@ -100,7 +100,7 @@ $this->output->set_header("Cache-Control: post-check=0, pre-check=0");<br />
$this->output->set_header("Pragma: no-cache"); </code>
-<h2>$this->output->set_status_header();</h2>
+<h2>$this->output->set_status_header(<var>code</var>, '<var>text</var>');</h2>
<p>Permits you to manually set a server status header. Example:</p>