I added two new functions for handling output filters in the
Apache2Handler SAPI:

bool apache_add_output_filter(string filter_name) - Attempts to add the
named filter to the Filter Chain.

array apache_get_output_filters() - Returns an array of all Active
Output filters for this request

The ability to add an output filter is very helpful in the apache
2model.  For example with this I was able to add an XSLT output filter
that I use in other areas to render XML generated from PHP to HTML.

The attached patches are for both PHP4 CVS and PHP5 CVS. They are also
online at: http://force-elite.com/~chip/patches/php-src/apache2-filters/

I posted this patches last Monday, but received 0 replies.  Are the
patches acceptable, is there anything to change, or are there any
comments?

Thanks,

-Paul Querna
Index: sapi/apache2handler/php_functions.c
===================================================================
RCS file: /repository/php-src/sapi/apache2handler/php_functions.c,v
retrieving revision 1.1.2.10
diff -u -r1.1.2.10 php_functions.c
--- sapi/apache2handler/php_functions.c 11 Nov 2003 20:04:19 -0000      1.1.2.10
+++ sapi/apache2handler/php_functions.c 20 Apr 2004 05:22:03 -0000
@@ -207,6 +207,65 @@
 }
 /* }}} */

+/* {{{ proto array apache_get_output_filters()
+   Get All Active Output filters */
+PHP_FUNCTION(apache_get_output_filters)
+{
+        ap_filter_t* ff;
+        php_struct *ctx;
+
+        if (ZEND_NUM_ARGS() != 0) {
+                WRONG_PARAM_COUNT;
+        }
+
+        if(array_init(return_value) != SUCCESS)
+        {
+                RETURN_NULL();
+        }
+
+        ctx = SG(server_context);
+
+        ff = ctx->r->output_filters;
+
+        do {
+                add_next_index_string(return_value, ff->frec->name, 1);
+                ff = ff->next ;
+        } while (ff);
+
+}
+/* }}} */
+
+/* {{{ proto bool apache_add_output_filter(string filter_name)
+   Add an output filter to this request */
+PHP_FUNCTION(apache_add_output_filter)
+{
+        php_struct *ctx;
+        int arg_count = ZEND_NUM_ARGS();
+        zval **filter_name;
+        ap_filter_rec_t* ap_filter;
+
+        if (arg_count != 1 ||
+                zend_get_parameters_ex(arg_count, &filter_name) == FAILURE) {
+                WRONG_PARAM_COUNT;
+        }
+
+        ctx = SG(server_context);
+
+        convert_to_string_ex(filter_name);
+
+        ap_filter = ap_get_output_filter_handle(Z_STRVAL_PP(filter_name));
+
+        /* requested output filter was not found */
+        if(ap_filter == NULL) {
+                RETURN_FALSE;
+        }
+        else {
+                ap_add_output_filter_handle(ap_filter, NULL, ctx->r, ctx->r->connection);
+                RETURN_TRUE;
+        }
+}
+/* }}} */
+
 /* {{{ proto string apache_note(string note_name [, string note_value])
    Get and set Apache request notes */
 PHP_FUNCTION(apache_note)
@@ -461,6 +520,8 @@
        PHP_FE(apache_response_headers, NULL)
        PHP_FE(apache_setenv, NULL)
        PHP_FE(apache_getenv, NULL)
+       PHP_FE(apache_get_output_filters, NULL)
+       PHP_FE(apache_add_output_filter, NULL)
        PHP_FE(apache_note, NULL)
        PHP_FE(apache_get_version, NULL)
        PHP_FE(apache_get_modules, NULL)

Index: sapi/apache2handler/php_functions.c
===================================================================
RCS file: /repository/php-src/sapi/apache2handler/php_functions.c,v
retrieving revision 1.13
diff -u -r1.13 php_functions.c
--- sapi/apache2handler/php_functions.c 8 Jan 2004 08:18:05 -0000       1.13
+++ sapi/apache2handler/php_functions.c 20 Apr 2004 05:00:59 -0000
@@ -209,6 +209,65 @@
 }
 /* }}} */

+/* {{{ proto array apache_get_output_filters()
+   Get All Active Output filters */
+PHP_FUNCTION(apache_get_output_filters)
+{
+       ap_filter_t* ff;
+       php_struct *ctx;
+
+       if (ZEND_NUM_ARGS() != 0) {
+               WRONG_PARAM_COUNT;
+       }
+
+       if(array_init(return_value) != SUCCESS)
+       {
+               RETURN_NULL();
+       }
+
+       ctx = SG(server_context);
+
+       ff = ctx->r->output_filters;
+
+       do {
+               add_next_index_string(return_value, ff->frec->name, 1);
+               ff = ff->next ;
+       } while (ff);
+
+}
+/* }}} */
+
+/* {{{ proto bool apache_add_output_filter(string filter_name)
+   Add an output filter to this request */
+PHP_FUNCTION(apache_add_output_filter)
+{
+       php_struct *ctx;
+       int arg_count = ZEND_NUM_ARGS();
+       zval **filter_name;
+       ap_filter_rec_t* ap_filter;
+
+       if (arg_count != 1 ||
+               zend_get_parameters_ex(arg_count, &filter_name) == FAILURE) {
+               WRONG_PARAM_COUNT;
+       }
+
+       ctx = SG(server_context);
+
+       convert_to_string_ex(filter_name);
+
+        ap_filter = ap_get_output_filter_handle(Z_STRVAL_PP(filter_name));
+
+        /* requested output filter was not found */
+       if(ap_filter == NULL) {
+               RETURN_FALSE;
+       }
+       else {
+               ap_add_output_filter_handle(ap_filter, NULL, ctx->r, ctx->r->connection);
+               RETURN_TRUE;
+       }
+}
+/* }}} */
+
 /* {{{ proto string apache_note(string note_name [, string note_value])
    Get and set Apache request notes */
 PHP_FUNCTION(apache_note)
@@ -459,6 +518,8 @@
 static function_entry apache_functions[] = {
        PHP_FE(apache_lookup_uri, NULL)
        PHP_FE(virtual, NULL)
+       PHP_FE(apache_get_output_filters, NULL)
+       PHP_FE(apache_add_output_filter, NULL)
        PHP_FE(apache_request_headers, NULL)
        PHP_FE(apache_response_headers, NULL)
        PHP_FE(apache_setenv, NULL)

Attachment: signature.asc
Description: This is a digitally signed message part

Reply via email to