Okay... Well, even though I've yet to convince Derick and a few others... I did see enough interest in this to create a patch. This creates two new directives: error_redirect (bool) which turns this on/off, and error_redirect_url (string) which is the URL to redirect to upon error. In order for these directives to have any effect, the headers (of course) must not have been already sent. This means that either output buffering must be enabled, or the script never got around to outputting anything. This patch will allow users to handle every error PHP generates if desired (including E_PARSE, etc).
The URL which is redirected to is passed the following parameters via a GET statement: errno - The error number (i.e. E_PARSE, whatever) Errfile - The path/file of the effected file Errline - The line which the error occurred Errmsg - The message provided describing the error: If the redirection fails (i.e. because headers had already been sent, whatever) the standard PHP error routine is used. Disclaimer: This is totally meant to be RFC at this point. It works, but Its not very friendly right now with the other error stuff (i.e. error_prepend, etc). If I can get a +1 on this concept, I'll clean things up before I commit. John --- php4/main/main.org.c Thu Nov 21 05:43:05 2002 +++ php4/main/main.c Thu Nov 21 05:43:18 2002 @@ -236,6 +236,8 @@ STD_PHP_INI_ENTRY("docref_root", "http://www.php.net/", PHP_INI_ALL, OnUpdateString, docref_root, php_core_globals, core_globals) STD_PHP_INI_ENTRY("docref_ext", "", PHP_INI_ALL, OnUpdateString, docref_ext, php_core_globals, core_globals) STD_PHP_INI_BOOLEAN("html_errors", "1", PHP_INI_ALL, OnUpdateBool, html_errors, php_core_globals, core_globals) + STD_PHP_INI_BOOLEAN("error_redirect", "0", PHP_INI_SYSTEM, OnUpdateBool, error_redirect, php_core_globals, core_globals) + STD_PHP_INI_ENTRY("error_redirect_url", NULL, PHP_INI_SYSTEM, OnUpdateString, error_redirect_url, php_core_globals, core_globals) STD_PHP_INI_BOOLEAN("xmlrpc_errors", "0", PHP_INI_SYSTEM, OnUpdateBool, xmlrpc_errors, php_core_globals, core_globals) STD_PHP_INI_ENTRY("xmlrpc_error_number", "0", PHP_INI_ALL, OnUpdateInt, xmlrpc_error_number, php_core_globals, core_globals) STD_PHP_INI_ENTRY("max_input_time", "-1", PHP_INI_SYSTEM|PHP_INI_PERDIR, OnUpdateInt, max_input_time,php_core_globals, core_globals) @@ -605,7 +607,40 @@ if (prepend_string) { PUTS(prepend_string); } - php_printf(error_format, error_type_str, buffer, error_filename, error_lineno); + if(PG(error_redirect) && !SG(headers_sent)) { + + sapi_header_line ctr = {0}; + char *url_params; + + int out_url_len, t_header_len; + + url_params = do_alloca(ERRORURL_BUF_LEN); + + snprintf(url_params, + ERRORURL_BUF_LEN-1, + "?errno=%d&errfile=%s&errline=%d&errmsg=%s", + type, + php_url_encode((char *)error_filename, strlen(error_filename), NULL), + error_lineno, + php_url_encode(buffer, strlen(buffer), NULL)); + + /* The +10 is to account for "Location: " */ + t_header_len = strlen(PG(error_redirect_url)) + strlen(url_params) + 10; + ctr.line = do_alloca(t_header_len); + snprintf(ctr.line, t_header_len+9,"Location: %s%s", PG(error_redirect_url), url_params); + + ctr.line_len = strlen(ctr.line); + + sapi_header_op(SAPI_HEADER_REPLACE, &ctr TSRMLS_CC); + + free_alloca(url_params); + free_alloca(ctr.line); + + } else { + + php_printf(error_format, error_type_str, buffer, error_filename, error_lineno); + } + if (PG(xmlrpc_errors)) { free_alloca(error_format); } -- PHP Development Mailing List <http://www.php.net/> To unsubscribe, visit: http://www.php.net/unsub.php