scottmac Thu, 03 Feb 2011 16:47:28 +0000
Revision: http://svn.php.net/viewvc?view=revision&revision=307977
Log:
Add header_register_callback(), allows a userland function
to be called as all the headers are being sent and after all
of the default headers have been merged.
headers_list(), header_remove() and header() can all be used
inside the callback.
<?php
header('Content-Type: text/plain');
header('X-Test: foo');
function foo() {
foreach (headers_list() as $header) {
if (strpos($header, 'X-Powered') !== false) {
header_remove('X-Powered-By');
}
header_remove('X-Test');
}
}
$result = header_register_callback('foo');
echo "a";
Changed paths:
U php/php-src/trunk/NEWS
U php/php-src/trunk/ext/standard/basic_functions.c
U php/php-src/trunk/ext/standard/basic_functions.h
U php/php-src/trunk/main/SAPI.c
U php/php-src/trunk/main/SAPI.h
Modified: php/php-src/trunk/NEWS
===================================================================
--- php/php-src/trunk/NEWS 2011-02-03 16:29:23 UTC (rev 307976)
+++ php/php-src/trunk/NEWS 2011-02-03 16:47:28 UTC (rev 307977)
@@ -42,6 +42,9 @@
. Added support for object references in recursive serialize() calls.
FR #36424. (Mike)
. Added http_response_code() function. FR #52555. (Paul Dragoonis, Kalle)
+ . Added header_register_callback() which is invoked immediately
+ prior to the sending of headers and after default headers have
+ been added. (Scott)
. Added DTrace support. (David Soria Parra)
. Improved output layer, see README.NEW-OUTPUT-API for internals. (Mike)
. Improved unserialize() performance.
Modified: php/php-src/trunk/ext/standard/basic_functions.c
===================================================================
--- php/php-src/trunk/ext/standard/basic_functions.c 2011-02-03 16:29:23 UTC
(rev 307976)
+++ php/php-src/trunk/ext/standard/basic_functions.c 2011-02-03 16:47:28 UTC
(rev 307977)
@@ -141,6 +141,13 @@
ZEND_ARG_INFO(0, seconds)
ZEND_END_ARG_INFO()
/* }}} */
+
+/* {{{ main/sapi.c */
+ZEND_BEGIN_ARG_INFO(arginfo_header_register_callback, 0)
+ ZEND_ARG_INFO(0, callback)
+ZEND_END_ARG_INFO()
+/* }}} */
+
/* {{{ main/output.c */
ZEND_BEGIN_ARG_INFO_EX(arginfo_ob_start, 0, 0, 0)
ZEND_ARG_INFO(0, user_function)
@@ -2940,6 +2947,7 @@
PHP_FE(convert_cyr_string,
arginfo_convert_cyr_string)
PHP_FE(get_current_user,
arginfo_get_current_user)
PHP_FE(set_time_limit,
arginfo_set_time_limit)
+ PHP_FE(header_register_callback,
arginfo_header_register_callback)
PHP_FE(get_cfg_var,
arginfo_get_cfg_var)
PHP_DEP_FALIAS(magic_quotes_runtime, set_magic_quotes_runtime,
arginfo_set_magic_quotes_runtime)
Modified: php/php-src/trunk/ext/standard/basic_functions.h
===================================================================
--- php/php-src/trunk/ext/standard/basic_functions.h 2011-02-03 16:29:23 UTC
(rev 307976)
+++ php/php-src/trunk/ext/standard/basic_functions.h 2011-02-03 16:47:28 UTC
(rev 307977)
@@ -69,6 +69,8 @@
PHP_FUNCTION(get_current_user);
PHP_FUNCTION(set_time_limit);
+PHP_FUNCTION(header_register_callback);
+
PHP_FUNCTION(get_cfg_var);
PHP_FUNCTION(set_magic_quotes_runtime);
PHP_FUNCTION(get_magic_quotes_runtime);
Modified: php/php-src/trunk/main/SAPI.c
===================================================================
--- php/php-src/trunk/main/SAPI.c 2011-02-03 16:29:23 UTC (rev 307976)
+++ php/php-src/trunk/main/SAPI.c 2011-02-03 16:47:28 UTC (rev 307977)
@@ -116,7 +116,59 @@
efree(sapi_header->header);
}
+/* {{{ proto bool header_register_callback(mixed callback)
+ call a header function */
+PHP_FUNCTION(header_register_callback)
+{
+ zval *callback_func;
+ char *callback_name;
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z",
&callback_func) == FAILURE) {
+ return;
+ }
+
+ if (!zend_is_callable(callback_func, 0, &callback_name TSRMLS_CC)) {
+ efree(callback_name);
+ RETURN_FALSE;
+ }
+ efree(callback_name);
+ if (SG(callback_func)) {
+ zval_ptr_dtor(&SG(callback_func));
+ SG(fci_cache) = empty_fcall_info_cache;
+ }
+
+ Z_ADDREF_P(callback_func);
+
+ SG(callback_func) = callback_func;
+
+ RETURN_TRUE;
+}
+/* }}} */
+
+static void sapi_run_header_callback()
+{
+ int error;
+ zend_fcall_info fci;
+ zval *retval_ptr = NULL;
+
+ fci.size = sizeof(fci);
+ fci.function_table = EG(function_table);
+ fci.object_ptr = NULL;
+ fci.function_name = SG(callback_func);
+ fci.retval_ptr_ptr = &retval_ptr;
+ fci.param_count = 0;
+ fci.params = NULL;
+ fci.no_separation = 0;
+ fci.symbol_table = NULL;
+
+ error = zend_call_function(&fci, &SG(fci_cache) TSRMLS_CC);
+ if (error == FAILURE) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Could not call the
sapi_header_callback");
+ } else if (retval_ptr) {
+ zval_ptr_dtor(&retval_ptr);
+ }
+}
+
SAPI_API void sapi_handle_post(void *arg TSRMLS_DC)
{
if (SG(request_info).post_entry && SG(request_info).content_type_dup) {
@@ -433,6 +485,9 @@
SAPI_API void sapi_deactivate(TSRMLS_D)
{
zend_llist_destroy(&SG(sapi_headers).headers);
+ if (SG(callback_func)) {
+ zval_ptr_dtor(&SG(callback_func));
+ }
if (SG(request_info).post_data) {
efree(SG(request_info).post_data);
} else if (SG(server_context)) {
@@ -574,7 +629,7 @@
char *header_line;
uint header_line_len;
int http_response_code;
-
+
if (SG(headers_sent) && !SG(request_info).no_headers) {
char *output_start_filename =
php_output_get_start_filename(TSRMLS_C);
int output_start_lineno = php_output_get_start_lineno(TSRMLS_C);
@@ -774,6 +829,11 @@
SG(sapi_headers).send_default_content_type = 0;
}
+ if (SG(callback_func) && !SG(callback_run)) {
+ SG(callback_run) = 1;
+ sapi_run_header_callback();
+ }
+
SG(headers_sent) = 1;
if (sapi_module.send_headers) {
Modified: php/php-src/trunk/main/SAPI.h
===================================================================
--- php/php-src/trunk/main/SAPI.h 2011-02-03 16:29:23 UTC (rev 307976)
+++ php/php-src/trunk/main/SAPI.h 2011-02-03 16:47:28 UTC (rev 307977)
@@ -131,6 +131,9 @@
zend_bool sapi_started;
double global_request_time;
HashTable known_post_content_types;
+ zval *callback_func;
+ zend_fcall_info_cache fci_cache;
+ zend_bool callback_run;
} sapi_globals_struct;
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php