[patch] one script to handle them all
| From: | Lukas Schroeder | Date: | Wed, 13 Feb 2002 02:50:27 +0000 |
| Subject: | [patch] one script to handle them all | ||
| Groups: | php.dev | ||
| Request: | Send a blank email to php-dev+get-79999@lists.php.net to get a copy of this message | ||
Hi,
(resubmitting. i submitted this on Jan 12 before, but did not get any
response.)
this is a 'request_handler'-support patch for php. it applies to
php-4.1.1. it only covers sapi/apache/...
diffstat says
mod_php4.c | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 57 insertions(+), 1 deletion(-)
with this patch applied you can use the following to register a
request_handler:
php_value request_handler /www/foo.php
every request going to a virtualhost / directory / location that a
request_handler is registered for will be passed to that /www/foo.php
script
the attached patch can also be downloaded from
http://www.azzit.de/patches/php4/
[it's the *request_handler* file there. duh. ;-)]
Comments, bug reports, suggestions are welcome,
regards,
-lukas
--- php-4.1.1/sapi/apache/mod_php4.c.orig Tue Feb 12 00:05:35 2002 +++ php-4.1.1/sapi/apache/mod_php4.c Wed Feb 13 02:57:13 2002 @@ -483,6 +483,39 @@ } /* }}} */ +/* {{{ php_get_request_handler + */ +static int php_get_request_handler(request_rec *r, char **target) +{ + HashTable *per_dir_conf; + php_per_dir_entry *per_dir_entry; + char *filename; + + if (!(per_dir_conf = get_module_config(r->per_dir_config, &php4_module))) + return 0; + + if (zend_hash_find(per_dir_conf, "request_handler", sizeof("request_handler")-1, + (void **)&per_dir_entry) == SUCCESS) { + + if (!ap_os_is_path_absolute(per_dir_entry->value)) { + char *dirnam = ap_pstrdup(r->pool, r->filename); + char *x = strrchr(dirnam, '/'); + + if (x != NULL) + *x = 0; + filename = ap_make_full_path(r->pool, dirnam, per_dir_entry->value); + } + else + filename = ap_pstrdup(r->pool, per_dir_entry->value); + + *target = filename; + return 1; + } + + return 0; +} +/* }}} */ + /* {{{ send_php */ static int send_php(request_rec *r, int display_source_mode, char *filename) @@ -502,6 +535,9 @@ return OK; } + if (php_get_request_handler(r, &filename)) + r->filename = filename; + zend_first_try { /* We don't accept OPTIONS requests, but take everything else */ if (r->method_number == M_OPTIONS) { @@ -846,6 +882,26 @@ } /* }}} */ +/* {{{ php_type_checker + */ +static int php_type_checker(request_rec *r) +{ + char *filename; + + /* if a request_handler has been registered, the type checker tells + * apache to invoke our send_php handler; otherwise we deny responsibility + * for this request + */ + + if (php_get_request_handler(r, &filename)) { + r->handler = "application/x-httpd-php"; + return OK; + } + + return DECLINED; +} +/* }}} */ + /* {{{ handler_rec php_handlers[] */ handler_rec php_handlers[] = @@ -885,7 +941,7 @@ NULL, /* check_user_id */ NULL, /* check auth */ NULL, /* check access */ - NULL, /* type_checker */ + php_type_checker, /* type_checker */ NULL, /* fixups */ NULL /* logger */ #if MODULE_MAGIC_NUMBER >= 19970103
--- php-4.1.1/sapi/apache/mod_php4.c.orig Tue Feb 12 00:05:35 2002 +++ php-4.1.1/sapi/apache/mod_php4.c Wed Feb 13 02:57:13 2002 @@ -483,6 +483,39 @@ } /* }}} */ +/* {{{ php_get_request_handler + */ +static int php_get_request_handler(request_rec *r, char **target) +{ + HashTable *per_dir_conf; + php_per_dir_entry *per_dir_entry; + char *filename; + + if (!(per_dir_conf = get_module_config(r->per_dir_config, &php4_module))) + return 0; + + if (zend_hash_find(per_dir_conf, "request_handler", sizeof("request_handler")-1, + (void **)&per_dir_entry) == SUCCESS) { + + if (!ap_os_is_path_absolute(per_dir_entry->value)) { + char *dirnam = ap_pstrdup(r->pool, r->filename); + char *x = strrchr(dirnam, '/'); + + if (x != NULL) + *x = 0; + filename = ap_make_full_path(r->pool, dirnam, per_dir_entry->value); + } + else + filename = ap_pstrdup(r->pool, per_dir_entry->value); + + *target = filename; + return 1; + } + + return 0; +} +/* }}} */ + /* {{{ send_php */ static int send_php(request_rec *r, int display_source_mode, char *filename) @@ -502,6 +535,9 @@ return OK; } + if (php_get_request_handler(r, &filename)) + r->filename = filename; + zend_first_try { /* We don't accept OPTIONS requests, but take everything else */ if (r->method_number == M_OPTIONS) { @@ -846,6 +882,26 @@ } /* }}} */ +/* {{{ php_type_checker + */ +static int php_type_checker(request_rec *r) +{ + char *filename; + + /* if a request_handler has been registered, the type checker tells + * apache to invoke our send_php handler; otherwise we deny responsibility + * for this request + */ + + if (php_get_request_handler(r, &filename)) { + r->handler = "application/x-httpd-php"; + return OK; + } + + return DECLINED; +} +/* }}} */ + /* {{{ handler_rec php_handlers[] */ handler_rec php_handlers[] = @@ -885,7 +941,7 @@ NULL, /* check_user_id */ NULL, /* check auth */ NULL, /* check access */ - NULL, /* type_checker */ + php_type_checker, /* type_checker */ NULL, /* fixups */ NULL /* logger */ #if MODULE_MAGIC_NUMBER >= 19970103