Index: sapi/apache/mod_php4.c =================================================================== RCS file: /repository/php4/sapi/apache/mod_php4.c,v retrieving revision 1.138 diff -u -r1.138 mod_php4.c --- sapi/apache/mod_php4.c 19 Aug 2002 15:52:21 -0000 1.138 +++ sapi/apache/mod_php4.c 26 Aug 2002 09:26:53 -0000 @@ -34,6 +34,7 @@ /* {{{ Prototypes */ int apache_php_module_main(request_rec *r, int display_source_mode TSRMLS_DC); +int apache_php_module_hook(request_rec *r, char *filename, zval **ret TSRMLS_DC); void php_save_umask(void); void php_restore_umask(void); int sapi_apache_read_post(char *buffer, uint count_bytes TSRMLS_DC); @@ -45,6 +46,7 @@ static int send_parsed_php_source(request_rec * r); int php_xbithack_handler(request_rec * r); void php_init_handler(server_rec *s, pool *p); + /* }}} */ #if MODULE_MAGIC_NUMBER >= 19970728 @@ -70,6 +72,7 @@ module MODULE_VAR_EXPORT php4_module; int saved_umask; +//static int setup_env = 0; static unsigned char apache_php_initialized; typedef struct _php_per_dir_entry { @@ -296,6 +299,9 @@ AP(in_request) = 0; php_request_shutdown(dummy); } + if(AP(setup_env)) { + AP(setup_env) = 0; + } } /* }}} */ @@ -649,13 +655,13 @@ static void *php_create_dir(pool *p, char *dummy) { HashTable *per_dir_info; - per_dir_info = (HashTable *) malloc(sizeof(HashTable)); zend_hash_init_ex(per_dir_info, 5, NULL, (void (*)(void *)) destroy_per_dir_entry, 1, 0); register_cleanup(p, (void *) per_dir_info, (void (*)(void *)) php_destroy_per_dir_info, (void (*)(void *)) zend_hash_destroy); return per_dir_info; } + /* }}} */ /* {{{ php_merge_dir @@ -668,6 +674,7 @@ } /* }}} */ + /* {{{ php_apache_value_handler_ex */ CONST_PREFIX char *php_apache_value_handler_ex(cmd_parms *cmd, HashTable *conf, char *arg1, char *arg2, int mode) @@ -835,6 +842,82 @@ } /* }}} */ +static int php_run_hook(request_rec *r, char *handler) +{ + zval *ret = NULL; + HashTable *conf; + + TSRMLS_FETCH(); + + if (!AP(apache_config_loaded)) { + conf = (HashTable *) get_module_config(r->per_dir_config, &php4_module); + if (conf) + zend_hash_apply((HashTable *)conf, (apply_func_t) php_apache_alter_ini_entries TSRMLS_CC); + AP(apache_config_loaded) = 1; + } + + if (!handler) + return DECLINED; + + hard_timeout("send", r); + SG(server_context) = r; + php_save_umask(); + if (!AP(setup_env)) { + add_common_vars(r); + add_cgi_vars(r); + AP(setup_env) = 1; + } + init_request_info(TSRMLS_C); + apache_php_module_hook(r, handler, &ret TSRMLS_CC); + php_restore_umask(); + kill_timeout(r); + + if (ret) { + convert_to_long(ret); + return Z_LVAL_P(ret); + } + + return HTTP_INTERNAL_SERVER_ERROR; +} + + +static int php_uri_translation(request_rec *r) +{ + fprintf(stderr, "HOOK: %s\n", __FUNCTION__); + return php_run_hook(r, AP(uri_handler)); +} + +static int php_auth_hook(request_rec *r) +{ + fprintf(stderr, "HOOK: %s\n", __FUNCTION__); + return php_run_hook(r, AP(auth_handler)); +} + +static int php_access_hook(request_rec *r) +{ + fprintf(stderr, "HOOK: %s\n", __FUNCTION__); + return php_run_hook(r, AP(access_handler)); +} + +static int php_type_hook(request_rec *r) +{ + fprintf(stderr, "HOOK: %s\n", __FUNCTION__); + return php_run_hook(r, AP(type_handler)); +} + +static int php_fixup_hook(request_rec *r) +{ + fprintf(stderr, "HOOK: %s\n", __FUNCTION__); + return php_run_hook(r, AP(fixup_handler)); +} + +static int php_logger_hook(request_rec *r) +{ + fprintf(stderr, "HOOK: %s\n", __FUNCTION__); + return php_run_hook(r, AP(logger_handler)); +} + + /* {{{ handler_rec php_handlers[] */ handler_rec php_handlers[] = @@ -858,7 +941,7 @@ }; /* }}} */ -/* {{{ odule MODULE_VAR_EXPORT php4_module +/* {{{ module MODULE_VAR_EXPORT php4_module */ module MODULE_VAR_EXPORT php4_module = { @@ -870,13 +953,13 @@ NULL, /* merge server config */ php_commands, /* command table */ php_handlers, /* handlers */ - NULL, /* filename translation */ + php_uri_translation, /* filename translation */ NULL, /* check_user_id */ - NULL, /* check auth */ - NULL, /* check access */ - NULL, /* type_checker */ - NULL, /* fixups */ - NULL /* logger */ + php_auth_hook, /* check auth */ + php_access_hook, /* check access */ + php_type_hook, /* type_checker */ + php_fixup_hook, /* fixups */ + php_logger_hook /* logger */ #if MODULE_MAGIC_NUMBER >= 19970103 , NULL /* header parser */ #endif @@ -884,7 +967,7 @@ , NULL /* child_init */ #endif #if MODULE_MAGIC_NUMBER >= 19970728 - , php_child_exit_handler /* child_exit */ + , php_child_exit_handler /* child_exit */ #endif #if MODULE_MAGIC_NUMBER >= 19970902 , NULL /* post read-request */ Index: sapi/apache/mod_php4.h =================================================================== RCS file: /repository/php4/sapi/apache/mod_php4.h,v retrieving revision 1.17 diff -u -r1.17 mod_php4.h --- sapi/apache/mod_php4.h 28 Feb 2002 08:27:19 -0000 1.17 +++ sapi/apache/mod_php4.h 26 Aug 2002 09:26:53 -0000 @@ -31,7 +31,15 @@ long last_modified; long xbithack; long terminate_child; + long setup_env; zend_bool in_request; + zend_bool apache_config_loaded; + char *uri_handler; + char *auth_handler; + char *access_handler; + char *type_handler; + char *fixup_handler; + char *logger_handler; } php_apache_info_struct; extern zend_module_entry apache_module_entry; Index: sapi/apache/php_apache.c =================================================================== RCS file: /repository/php4/sapi/apache/php_apache.c,v retrieving revision 1.66 diff -u -r1.66 php_apache.c --- sapi/apache/php_apache.c 13 Aug 2002 04:03:20 -0000 1.66 +++ sapi/apache/php_apache.c 26 Aug 2002 09:26:53 -0000 @@ -37,6 +37,8 @@ #define SECTION(name) PUTS("

" name "

\n") extern module *top_module; +static int le_apachereq; +static zend_class_entry *apacherequest_class_entry; PHP_FUNCTION(virtual); PHP_FUNCTION(apache_request_headers); @@ -49,6 +51,7 @@ PHP_MINFO_FUNCTION(apache); + function_entry apache_functions[] = { PHP_FE(virtual, NULL) PHP_FE(apache_request_headers, NULL) @@ -61,15 +64,22 @@ {NULL, NULL, NULL} }; - +/* {{{ php_apache ini entries + */ PHP_INI_BEGIN() STD_PHP_INI_ENTRY("xbithack", "0", PHP_INI_ALL, OnUpdateInt, xbithack, php_apache_info_struct, php_apache_info) STD_PHP_INI_ENTRY("engine", "1", PHP_INI_ALL, OnUpdateInt, engine, php_apache_info_struct, php_apache_info) STD_PHP_INI_ENTRY("last_modified", "0", PHP_INI_ALL, OnUpdateInt, last_modified, php_apache_info_struct, php_apache_info) STD_PHP_INI_ENTRY("child_terminate", "0", PHP_INI_ALL, OnUpdateInt, terminate_child, php_apache_info_struct, php_apache_info) -PHP_INI_END() - + STD_PHP_INI_ENTRY("uri_handler", NULL, PHP_INI_ALL, OnUpdateString, uri_handler, php_apache_info_struct, php_apache_info) + STD_PHP_INI_ENTRY("auth_handler", NULL, PHP_INI_ALL, OnUpdateString, auth_handler, php_apache_info_struct, php_apache_info) + STD_PHP_INI_ENTRY("access_handler", NULL, PHP_INI_ALL, OnUpdateString, access_handler, php_apache_info_struct, php_apache_info) + STD_PHP_INI_ENTRY("type_handler", NULL, PHP_INI_ALL, OnUpdateString, type_handler, php_apache_info_struct, php_apache_info) + STD_PHP_INI_ENTRY("fixup_handler", NULL, PHP_INI_ALL, OnUpdateString, fixup_handler, php_apache_info_struct, php_apache_info) + STD_PHP_INI_ENTRY("logger_handler", NULL, PHP_INI_ALL, OnUpdateString, logger_handler, php_apache_info_struct, php_apache_info) +PHP_INI_END() +/* }}} */ static void php_apache_globals_ctor(php_apache_info_struct *apache_globals TSRMLS_DC) { @@ -77,14 +87,875 @@ } +#define APREQ_GET_THIS(ZVAL) if (NULL == (ZVAL = getThis())) { \ + php_error(E_WARNING, "%s(): underlying ApacheRequest object missing", \ + get_active_function_name(TSRMLS_C)); \ + RETURN_FALSE; \ + } +#define APREQ_GET_REQUEST(ZVAL, R) APREQ_GET_THIS(ZVAL); \ + R = get_apache_request(ZVAL) + +static void php_apache_request_free(zend_rsrc_list_entry *rsrc TSRMLS_DC) +{ + zval *z = (zval *)rsrc->ptr; + fprintf(stderr, "%s() %p\n", __FUNCTION__, z); + zval_ptr_dtor(&z); +} + +static request_rec *get_apache_request(zval *z) +{ + request_rec *r; + zval **addr; + + if (NULL == z) { + php_error(E_WARNING, "get_apache_request() invalid wrapper passed"); + return NULL; + } + + if (Z_TYPE_P(z) != IS_OBJECT) { + php_error(E_WARNING, "%s(): wrapper is not an object", get_active_function_name(TSRMLS_C)); + return NULL; + } + + if (zend_hash_index_find(Z_OBJPROP_P(z), 0, (void **)&addr) == FAILURE) { + php_error(E_WARNING, "%s(): underlying object missing", get_active_function_name(TSRMLS_C)); + return NULL; + } + + r = (request_rec *)Z_LVAL_PP(addr); + if (!r) { + php_error(E_WARNING, "%s(): request_rec invalid", get_active_function_name(TSRMLS_C)); + return NULL; + } + + return r; +} + +/* {{{ + */ +PHPAPI zval *php_apache_request_new(request_rec *r) +{ + zval *req; + zval *addr; + + MAKE_STD_ZVAL(addr); + Z_TYPE_P(addr) = IS_LONG; + Z_LVAL_P(addr) = (int) r; + + MAKE_STD_ZVAL(req); + object_init_ex(req, apacherequest_class_entry); + zend_hash_index_update(Z_OBJPROP_P(req), 0, &addr, sizeof(zval *), NULL); + + return req; +} +/* }}} */ + +/* {{{ apache_request_read_string_slot() + */ +static void apache_request_read_string_slot(int offset, INTERNAL_FUNCTION_PARAMETERS) +{ + zval *id, **new_value; + request_rec *r; + char *s; + + if (ZEND_NUM_ARGS() > 0) { + WRONG_PARAM_COUNT; + } + + APREQ_GET_REQUEST(id, r); + + s = *(char **)((char*)r + offset); + + if (s) + RETURN_STRING(s, 1); + + RETURN_EMPTY_STRING(); +} +/* }}} */ + + +/* {{{ apache_request_string_slot() + */ +static void apache_request_string_slot(int offset, INTERNAL_FUNCTION_PARAMETERS) +{ + zval *id, **new_value; + request_rec *r; + char *old_value; + char **target; + + APREQ_GET_REQUEST(id, r); + + target = (char **)((char*)r + offset); + old_value = *target; + + switch (ZEND_NUM_ARGS()) { + case 0: + break; + case 1: + if (zend_get_parameters_ex(1, &new_value) == FAILURE) { + RETURN_FALSE; + } + convert_to_string_ex(new_value); + *target = ap_pstrdup(r->pool, Z_STRVAL_PP(new_value)); + break; + default: + WRONG_PARAM_COUNT; + break; + } + + if (old_value) + RETURN_STRING(old_value, 1); + + RETURN_EMPTY_STRING(); +} +/* }}} */ + +/* {{{ apache_request_read_int_slot() + */ +static void apache_request_read_int_slot(int offset, INTERNAL_FUNCTION_PARAMETERS) +{ + zval *id; + request_rec *r; + long l; + + if (ZEND_NUM_ARGS() > 0) { + WRONG_PARAM_COUNT; + } + + APREQ_GET_REQUEST(id, r); + + l = *(long *)((char*)r + offset); + + RETURN_LONG(l); +} +/* }}} */ + +/* {{{ apache_request_int_slot() + */ +static void apache_request_int_slot(int offset, INTERNAL_FUNCTION_PARAMETERS) +{ + zval *id, **new_value; + request_rec *r; + long old_value; + long *target; + + APREQ_GET_REQUEST(id, r); + + target = (long *)((char*)r + offset); + old_value = *target; + + switch (ZEND_NUM_ARGS()) { + case 0: + break; + case 1: + if (zend_get_parameters_ex(1, &new_value) == FAILURE) { + RETURN_FALSE; + } + convert_to_long_ex(new_value); + *target = Z_LVAL_PP(new_value); + break; + default: + WRONG_PARAM_COUNT; + break; + } + + RETURN_LONG(old_value); +} +/* }}} */ + + +/* {{{ access string slots of request rec + */ + +/* {{{ proto string $request->filename([string new_filename]) + */ +PHP_FUNCTION(apache_request_filename) +{ + apache_request_string_slot(offsetof(request_rec, filename), INTERNAL_FUNCTION_PARAM_PASSTHRU); +} +/* }}} */ + +/* {{{ proto string $request->uri([string new_uri]) + */ +PHP_FUNCTION(apache_request_uri) +{ + apache_request_string_slot(offsetof(request_rec, uri), INTERNAL_FUNCTION_PARAM_PASSTHRU); +} +/* }}} */ + +/* {{{ proto string $request->unparsed_uri([string new_unparsed_uri]) + */ +PHP_FUNCTION(apache_request_unparsed_uri) +{ + apache_request_string_slot(offsetof(request_rec, unparsed_uri), INTERNAL_FUNCTION_PARAM_PASSTHRU); +} +/* }}} */ + +/* {{{ proto string $request->path_info([string new_path_info]) + */ +PHP_FUNCTION(apache_request_path_info) +{ + apache_request_string_slot(offsetof(request_rec, path_info), INTERNAL_FUNCTION_PARAM_PASSTHRU); +} +/* }}} */ + +/* {{{ proto string $request->args([string new_args]) + */ +PHP_FUNCTION(apache_request_args) +{ + apache_request_string_slot(offsetof(request_rec, args), INTERNAL_FUNCTION_PARAM_PASSTHRU); +} +/* }}} */ + +/* {{{ proto string $request->boundary() + */ +PHP_FUNCTION(apache_request_boundary) +{ + apache_request_read_string_slot(offsetof(request_rec, boundary), INTERNAL_FUNCTION_PARAM_PASSTHRU); +} +/* }}} */ + + +/* {{{ proto string $request->content_type([string new_type]) + */ +PHP_FUNCTION(apache_request_content_type) +{ + apache_request_string_slot(offsetof(request_rec, content_type), INTERNAL_FUNCTION_PARAM_PASSTHRU); +} +/* }}} */ + +/* {{{ proto string $request->content_encoding([string new_encoding]) + */ +PHP_FUNCTION(apache_request_content_encoding) +{ + apache_request_string_slot(offsetof(request_rec, content_encoding), INTERNAL_FUNCTION_PARAM_PASSTHRU); +} +/* }}} */ + +/* {{{ proto string $request->handler([string new_handler]) + */ +PHP_FUNCTION(apache_request_handler) +{ + apache_request_string_slot(offsetof(request_rec, handler), INTERNAL_FUNCTION_PARAM_PASSTHRU); +} +/* }}} */ + +/* {{{ proto string $request->the_request() + */ +PHP_FUNCTION(apache_request_the_request) +{ + apache_request_read_string_slot(offsetof(request_rec, the_request), INTERNAL_FUNCTION_PARAM_PASSTHRU); +} +/* }}} */ + +/* {{{ proto string $request->protocol() + */ +PHP_FUNCTION(apache_request_protocol) +{ + apache_request_read_string_slot(offsetof(request_rec, protocol), INTERNAL_FUNCTION_PARAM_PASSTHRU); +} +/* }}} */ + +/* {{{ proto string $request->hostname() + */ +PHP_FUNCTION(apache_request_hostname) +{ + apache_request_read_string_slot(offsetof(request_rec, hostname), INTERNAL_FUNCTION_PARAM_PASSTHRU); +} +/* }}} */ + +/* {{{ proto string $request->status_line([string new_status_line]) + */ +PHP_FUNCTION(apache_request_status_line) +{ + apache_request_string_slot(offsetof(request_rec, status_line), INTERNAL_FUNCTION_PARAM_PASSTHRU); +} +/* }}} */ + +/* {{{ proto string $request->method() + */ +PHP_FUNCTION(apache_request_method) +{ + apache_request_read_string_slot(offsetof(request_rec, method), INTERNAL_FUNCTION_PARAM_PASSTHRU); +} +/* }}} */ + +/* }}} access string slots of request rec */ + +/* {{{ access int slots of request_rec + */ + +/* {{{ proto int $request->proto_num() + */ +PHP_FUNCTION(apache_request_proto_num) +{ + apache_request_read_int_slot(offsetof(request_rec, proto_num), INTERNAL_FUNCTION_PARAM_PASSTHRU); +} +/* }}} */ + +/* {{{ proto int $request->assbackwards() + */ +PHP_FUNCTION(apache_request_assbackwards) +{ + apache_request_read_int_slot(offsetof(request_rec, assbackwards), INTERNAL_FUNCTION_PARAM_PASSTHRU); +} +/* }}} */ + + +/* {{{ proto int $request->proxyreq([int new_proxyreq]) + */ +PHP_FUNCTION(apache_request_proxyreq) +{ + apache_request_int_slot(offsetof(request_rec, proxyreq), INTERNAL_FUNCTION_PARAM_PASSTHRU); +} +/* }}} */ + +/* {{{ proto int $request->chunked() + */ +PHP_FUNCTION(apache_request_chunked) +{ + apache_request_read_int_slot(offsetof(request_rec, chunked), INTERNAL_FUNCTION_PARAM_PASSTHRU); +} +/* }}} */ + + +/* {{{ proto int $request->header_only() + */ +PHP_FUNCTION(apache_request_header_only) +{ + apache_request_read_int_slot(offsetof(request_rec, header_only), INTERNAL_FUNCTION_PARAM_PASSTHRU); +} +/* }}} */ + +/* {{{ proto int $request->request_time() + */ +PHP_FUNCTION(apache_request_request_time) +{ + apache_request_read_int_slot(offsetof(request_rec, request_time), INTERNAL_FUNCTION_PARAM_PASSTHRU); +} +/* }}} */ + +/* {{{ proto int $request->status([int new_status]) + */ +PHP_FUNCTION(apache_request_status) +{ + apache_request_int_slot(offsetof(request_rec, status), INTERNAL_FUNCTION_PARAM_PASSTHRU); +} +/* }}} */ + +/* {{{ proto int $request->method_number([int method_number]) + */ +PHP_FUNCTION(apache_request_method_number) +{ + apache_request_read_int_slot(offsetof(request_rec, method_number), INTERNAL_FUNCTION_PARAM_PASSTHRU); +} +/* }}} */ + +/* {{{ proto int $request->allowed([int allowed]) + */ +PHP_FUNCTION(apache_request_allowed) +{ + apache_request_int_slot(offsetof(request_rec, allowed), INTERNAL_FUNCTION_PARAM_PASSTHRU); +} +/* }}} */ + +/* {{{ proto int $request->bytes_sent() + */ +PHP_FUNCTION(apache_request_bytes_sent) +{ + apache_request_read_int_slot(offsetof(request_rec, bytes_sent), INTERNAL_FUNCTION_PARAM_PASSTHRU); +} +/* }}} */ + +/* {{{ proto int $request->mtime() + */ +PHP_FUNCTION(apache_request_mtime) +{ + apache_request_read_int_slot(offsetof(request_rec, mtime), INTERNAL_FUNCTION_PARAM_PASSTHRU); +} +/* }}} */ + +/* {{{ proto int $request->content_length([int new_content_length]) + */ +PHP_FUNCTION(apache_request_content_length) +{ + zval *id, **zlen; + request_rec *r; + + if (ZEND_NUM_ARGS() == 0) { + apache_request_read_int_slot(offsetof(request_rec, clength), INTERNAL_FUNCTION_PARAM_PASSTHRU); + } + else if (ZEND_NUM_ARGS() > 1) { + WRONG_PARAM_COUNT; + } + else { + if (zend_get_parameters_ex(1, &zlen) == FAILURE) { + RETURN_FALSE; + } + + APREQ_GET_REQUEST(id, r); + + convert_to_long_ex(zlen); + (void)ap_set_content_length(r, Z_LVAL_PP(zlen)); + RETURN_TRUE; + } +} +/* }}} */ + +/* {{{ proto int $request->remaining() + */ +PHP_FUNCTION(apache_request_remaining) +{ + apache_request_read_int_slot(offsetof(request_rec, remaining), INTERNAL_FUNCTION_PARAM_PASSTHRU); +} +/* }}} */ + +/* {{{ proto int $request->no_cache() + */ +PHP_FUNCTION(apache_request_no_cache) +{ + apache_request_int_slot(offsetof(request_rec, no_cache), INTERNAL_FUNCTION_PARAM_PASSTHRU); +} +/* }}} */ + +/* {{{ proto int $request->no_local_copy() + */ +PHP_FUNCTION(apache_request_no_local_copy) +{ + apache_request_int_slot(offsetof(request_rec, no_local_copy), INTERNAL_FUNCTION_PARAM_PASSTHRU); +} +/* }}} */ + +/* {{{ proto int $request->read_body() + */ +PHP_FUNCTION(apache_request_read_body) +{ + apache_request_int_slot(offsetof(request_rec, read_body), INTERNAL_FUNCTION_PARAM_PASSTHRU); +} +/* }}} */ + + +/* }}} access int slots of request_rec */ + +/* {{{ proxy functions for the ap_* functions family + */ + +/* {{{ proto int apache_request_server_port() + */ +PHP_FUNCTION(apache_request_server_port) +{ + zval *id; + request_rec *r; + + if (ZEND_NUM_ARGS() > 0) { + WRONG_PARAM_COUNT; + } + + APREQ_GET_REQUEST(id, r); + + RETURN_LONG(ap_get_server_port(r)); +} +/* }}} */ + +/* {{{ proto int apache_request_remote_host([int type]) + */ +PHP_FUNCTION(apache_request_remote_host) +{ + zval *id, **ztype; + request_rec *r; + char *res; + int type = REMOTE_NAME; + + switch (ZEND_NUM_ARGS()) { + case 0: + break; + case 1: + if (zend_get_parameters_ex(1, &ztype) == FAILURE) { + RETURN_FALSE; + } + convert_to_long_ex(ztype); + type = Z_LVAL_PP(ztype); + break; + default: + WRONG_PARAM_COUNT; + break; + } + + + APREQ_GET_REQUEST(id, r); + + res = (char *)ap_get_remote_host(r->connection, r->per_dir_config, type); + if (res) + RETURN_STRING(res, 1); + + RETURN_EMPTY_STRING(); +} +/* }}} */ + +/* {{{ proto long apache_request_update_mtime([int dependency_mtime]) + */ +PHP_FUNCTION(apache_request_update_mtime) +{ + zval *id, **zmtime; + request_rec *r; + int mtime = 0; + + switch (ZEND_NUM_ARGS()) { + case 0: + break; + case 1: + if (zend_get_parameters_ex(1, &zmtime) == FAILURE) { + RETURN_FALSE; + } + convert_to_long_ex(zmtime); + mtime = Z_LVAL_PP(zmtime); + break; + default: + WRONG_PARAM_COUNT; + break; + } + + + APREQ_GET_REQUEST(id, r); + + RETURN_LONG(ap_update_mtime(r, mtime)); +} +/* }}} */ + + +/* {{{ proto void apache_request_set_etag() + */ +PHP_FUNCTION(apache_request_set_etag) +{ + zval *id; + request_rec *r; + + if (ZEND_NUM_ARGS() > 0) { + WRONG_PARAM_COUNT; + } + + APREQ_GET_REQUEST(id, r); + + ap_set_etag(r); + RETURN_TRUE; +} +/* }}} */ + +/* {{{ proto void apache_request_set_last_modified() + */ +PHP_FUNCTION(apache_request_set_last_modified) +{ + zval *id; + request_rec *r; + + if (ZEND_NUM_ARGS() > 0) { + WRONG_PARAM_COUNT; + } + + APREQ_GET_REQUEST(id, r); + + ap_set_last_modified(r); + RETURN_TRUE; +} +/* }}} */ + +/* {{{ proto long apache_request_meets_conditions() + */ +PHP_FUNCTION(apache_request_meets_conditions) +{ + zval *id; + request_rec *r; + + if (ZEND_NUM_ARGS() > 0) { + WRONG_PARAM_COUNT; + } + + APREQ_GET_REQUEST(id, r); + + RETURN_LONG(ap_meets_conditions(r)); +} +/* }}} */ + +/* {{{ proto long apache_request_discard_request_body() + */ +PHP_FUNCTION(apache_request_discard_request_body) +{ + zval *id; + request_rec *r; + + if (ZEND_NUM_ARGS() > 0) { + WRONG_PARAM_COUNT; + } + + APREQ_GET_REQUEST(id, r); + + RETURN_LONG(ap_discard_request_body(r)); +} +/* }}} */ + +/* {{{ proto long apache_request_satisfies() + */ +PHP_FUNCTION(apache_request_satisfies) +{ + zval *id; + request_rec *r; + + if (ZEND_NUM_ARGS() > 0) { + WRONG_PARAM_COUNT; + } + + APREQ_GET_REQUEST(id, r); + + RETURN_LONG(ap_satisfies(r)); +} +/* }}} */ + + +/* {{{ proto bool apache_request_is_initial_req() + */ +PHP_FUNCTION(apache_request_is_initial_req) +{ + zval *id; + request_rec *r; + + if (ZEND_NUM_ARGS() > 0) { + WRONG_PARAM_COUNT; + } + + APREQ_GET_REQUEST(id, r); + + RETURN_BOOL(ap_is_initial_req(r)); +} +/* }}} */ + +/* {{{ proto bool apache_request_some_auth_required() + */ +PHP_FUNCTION(apache_request_some_auth_required) +{ + zval *id; + request_rec *r; + + if (ZEND_NUM_ARGS() > 0) { + WRONG_PARAM_COUNT; + } + + APREQ_GET_REQUEST(id, r); + + RETURN_BOOL(ap_some_auth_required(r)); +} +/* }}} */ + +/* {{{ proto string apache_request_auth_type() + */ +PHP_FUNCTION(apache_request_auth_type) +{ + zval *id; + request_rec *r; + char *t; + + if (ZEND_NUM_ARGS() > 0) { + WRONG_PARAM_COUNT; + } + + APREQ_GET_REQUEST(id, r); + + t = (char *)ap_auth_type(r); + if (!t) + RETURN_NULL(); + + RETURN_STRING(t, 1); +} +/* }}} */ + +/* {{{ proto string apache_request_auth_name() + */ +PHP_FUNCTION(apache_request_auth_name) +{ + zval *id; + request_rec *r; + char *t; + + if (ZEND_NUM_ARGS() > 0) { + WRONG_PARAM_COUNT; + } + + APREQ_GET_REQUEST(id, r); + + t = (char *)ap_auth_name(r); + if (!t) + RETURN_NULL(); + + RETURN_STRING(t, 1); +} +/* }}} */ + +/* {{{ proto apache_request_basic_auth_pw() + */ +PHP_FUNCTION(apache_request_basic_auth_pw) +{ + zval *id, *zpw; + request_rec *r; + const char *pw; + long status; + + if (ZEND_NUM_ARGS() != 1) { + WRONG_PARAM_COUNT; + } + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &zpw) == FAILURE) { + RETURN_NULL(); + } + + if (!PZVAL_IS_REF(zpw)) { + zend_error(E_WARNING, "Parameter wasn't passed by reference"); + RETURN_NULL(); + } + + + APREQ_GET_REQUEST(id, r); + + pw = NULL; + status = ap_get_basic_auth_pw(r, &pw); + if (status == OK && pw) { + ZVAL_STRING(zpw, (char *)pw, 1); + } + else + ZVAL_NULL(zpw); + RETURN_LONG(status); +} +/* }}} */ + + + + +/* }}} */ + +/* {{{ php_apache_request_class_functions + */ +static function_entry php_apache_request_class_functions[] = { + /* string slots */ + PHP_FALIAS(args, apache_request_args, NULL) + PHP_FALIAS(boundary, apache_request_boundary, NULL) + PHP_FALIAS(content_encoding, apache_request_content_encoding, NULL) + PHP_FALIAS(content_type, apache_request_content_type, NULL) + PHP_FALIAS(filename, apache_request_filename, NULL) + PHP_FALIAS(handler, apache_request_handler, NULL) + PHP_FALIAS(hostname, apache_request_hostname, NULL) + PHP_FALIAS(method, apache_request_method, NULL) + PHP_FALIAS(path_info, apache_request_path_info, NULL) + PHP_FALIAS(protocol, apache_request_protocol, NULL) + PHP_FALIAS(status_line, apache_request_status_line, NULL) + PHP_FALIAS(the_request, apache_request_the_request, NULL) + PHP_FALIAS(unparsed_uri, apache_request_unparsed_uri, NULL) + PHP_FALIAS(uri, apache_request_uri, NULL) + + /* int slots */ + PHP_FALIAS(allowed, apache_request_allowed, NULL) + PHP_FALIAS(bytes_sent, apache_request_bytes_sent, NULL) + PHP_FALIAS(chunked, apache_request_chunked, NULL) + PHP_FALIAS(content_length, apache_request_content_length, NULL) + PHP_FALIAS(header_only, apache_request_header_only, NULL) + PHP_FALIAS(method_number, apache_request_method_number, NULL) + PHP_FALIAS(mtime, apache_request_mtime, NULL) + PHP_FALIAS(no_cache, apache_request_no_cache, NULL) + PHP_FALIAS(no_local_copy, apache_request_no_local_copy, NULL) + PHP_FALIAS(proto_num, apache_request_proto_num, NULL) + PHP_FALIAS(proxyreq, apache_request_proxyreq, NULL) + PHP_FALIAS(read_body, apache_request_read_body, NULL) + PHP_FALIAS(remaining, apache_request_remaining, NULL) + PHP_FALIAS(request_time, apache_request_request_time, NULL) + PHP_FALIAS(status, apache_request_status, NULL) + + /* proxy functions for the ap_* functions family */ +#undef auth_name +#undef auth_type +#undef discard_request_body +#undef is_initial_req +#undef meets_conditions +#undef satisfies +#undef set_etag +#undef set_last_modified +#undef some_auth_required +#undef update_mtime + PHP_FALIAS(auth_name, apache_request_auth_name, NULL) + PHP_FALIAS(auth_type, apache_request_auth_type, NULL) + PHP_FALIAS(basic_auth_pw, apache_request_basic_auth_pw, NULL) + PHP_FALIAS(discard_request_body, apache_request_discard_request_body, NULL) + PHP_FALIAS(is_initial_req, apache_request_is_initial_req, NULL) + PHP_FALIAS(meets_conditions, apache_request_meets_conditions, NULL) + PHP_FALIAS(remote_host, apache_request_remote_host, NULL) + PHP_FALIAS(satisfies, apache_request_satisfies, NULL) + PHP_FALIAS(server_port, apache_request_server_port, NULL) + PHP_FALIAS(set_etag, apache_request_set_etag, NULL) + PHP_FALIAS(set_last_modified, apache_request_set_last_modified, NULL) + PHP_FALIAS(some_auth_required, apache_request_some_auth_required, NULL) + PHP_FALIAS(update_mtime, apache_request_update_mtime, NULL) + + { NULL, NULL, NULL } +}; +/* }}} */ + + static PHP_MINIT_FUNCTION(apache) { + zend_class_entry ce; + #ifdef ZTS ts_allocate_id(&php_apache_info_id, sizeof(php_apache_info_struct), (ts_allocate_ctor) php_apache_globals_ctor, NULL); #else php_apache_globals_ctor(&php_apache_info TSRMLS_CC); #endif REGISTER_INI_ENTRIES(); + + + le_apachereq = zend_register_list_destructors_ex(php_apache_request_free, NULL, "ApacheRequest", module_number); + INIT_OVERLOADED_CLASS_ENTRY(ce, "ApacheRequest", php_apache_request_class_functions, NULL, NULL, NULL); + apacherequest_class_entry = zend_register_internal_class_ex(&ce, NULL, NULL TSRMLS_CC); + + REGISTER_LONG_CONSTANT("OK", OK, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("DECLINED", DECLINED, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("FORBIDDEN", FORBIDDEN, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("AUTH_REQUIRED", AUTH_REQUIRED, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("DONE", DONE, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("SERVER_ERROR", SERVER_ERROR, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("REDIRECT", REDIRECT, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("BAD_REQUEST", BAD_REQUEST, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("NOT_FOUND", NOT_FOUND, CONST_CS | CONST_PERSISTENT); + + REGISTER_LONG_CONSTANT("M_GET", M_GET, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("M_PUT", M_PUT, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("M_POST", M_POST, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("M_DELETE", M_DELETE, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("M_CONNECT", M_CONNECT, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("M_OPTIONS", M_OPTIONS, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("M_TRACE", M_TRACE, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("M_PATCH", M_PATCH, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("M_PROPFIND", M_PROPFIND, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("M_PROPPATCH", M_PROPPATCH, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("M_MKCOL", M_MKCOL, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("M_COPY", M_COPY, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("M_MOVE", M_MOVE, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("M_LOCK", M_LOCK, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("M_UNLOCK", M_UNLOCK, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("M_INVALID", M_INVALID, CONST_CS | CONST_PERSISTENT); + + /* Possible values for request_rec.read_body (set by handling module): + * REQUEST_NO_BODY Send 413 error if message has any body + * REQUEST_CHUNKED_ERROR Send 411 error if body without Content-Length + * REQUEST_CHUNKED_DECHUNK If chunked, remove the chunks for me. + * REQUEST_CHUNKED_PASS Pass the chunks to me without removal. + */ + REGISTER_LONG_CONSTANT("REQUEST_NO_BODY", REQUEST_NO_BODY, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("REQUEST_CHUNKED_ERROR", REQUEST_CHUNKED_ERROR, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("REQUEST_CHUNKED_DECHUNK", REQUEST_CHUNKED_DECHUNK, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("REQUEST_CHUNKED_PASS", REQUEST_CHUNKED_PASS, CONST_CS | CONST_PERSISTENT); + + /* resolve types for remote_host() */ + REGISTER_LONG_CONSTANT("REMOTE_HOST", REMOTE_HOST, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("REMOTE_NAME", REMOTE_NAME, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("REMOTE_NOLOOKUP", REMOTE_NOLOOKUP, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("REMOTE_DOUBLE_REV", REMOTE_DOUBLE_REV, CONST_CS | CONST_PERSISTENT); + return SUCCESS; } Index: sapi/apache/php_apache_http.h =================================================================== RCS file: /repository/php4/sapi/apache/php_apache_http.h,v retrieving revision 1.3 diff -u -r1.3 php_apache_http.h --- sapi/apache/php_apache_http.h 31 May 2002 04:47:19 -0000 1.3 +++ sapi/apache/php_apache_http.h 26 Aug 2002 09:26:53 -0000 @@ -36,3 +36,7 @@ #include "ext/standard/php_standard.h" #include "mod_php4.h" + + +PHPAPI zval *php_apache_request_new(request_rec *r); + Index: sapi/apache/sapi_apache.c =================================================================== RCS file: /repository/php4/sapi/apache/sapi_apache.c,v retrieving revision 1.40 diff -u -r1.40 sapi_apache.c --- sapi/apache/sapi_apache.c 23 Apr 2002 03:01:30 -0000 1.40 +++ sapi/apache/sapi_apache.c 26 Aug 2002 09:26:53 -0000 @@ -65,6 +65,50 @@ } /* }}} */ +/* {{{ apache_php_module_hook + */ +int apache_php_module_hook(request_rec *r, char *filename, zval **ret TSRMLS_DC) +{ + zend_file_handle file_handle; + zval *req; + +#if PHP_SIGCHILD + signal(SIGCHLD, sigchld_handler); +#endif + + if (AP(setup_env) != 2) { + fprintf(stderr, "REQUEST STARTUP\n"); + + if (php_request_startup(TSRMLS_C) == FAILURE) + return FAILURE; + AP(setup_env) = 2; + } + + /* Add PHP_SELF_HOOK - Absolute path */ + php_register_variable("PHP_SELF_HOOK", filename, PG(http_globals)[TRACK_VARS_SERVER] TSRMLS_CC); + + req = php_apache_request_new(r); + php_register_variable_ex("request", req, NULL TSRMLS_CC); + + memset(&file_handle, 0, sizeof(file_handle)); + file_handle.type = ZEND_HANDLE_FILENAME; + file_handle.filename = filename; + + (void) php_execute_simple_script(&file_handle, ret TSRMLS_CC); + + zval_dtor(&req); + AP(in_request) = 0; + +// zend_try { +// php_request_shutdown_for_hook(NULL); +// } zend_end_try(); + + return OK; +} + +/* }}} */ + + /* * Local variables: * tab-width: 4 Index: main/main.c =================================================================== RCS file: /repository/php4/main/main.c,v retrieving revision 1.481 diff -u -r1.481 main.c --- main/main.c 20 Aug 2002 19:49:37 -0000 1.481 +++ main/main.c 26 Aug 2002 09:26:58 -0000 @@ -865,6 +865,35 @@ } /* }}} */ +/* {{{ php_request_startup_for_hook + */ +int php_request_startup_for_hook(TSRMLS_D) +{ + int retval = SUCCESS; + +#if PHP_SIGCHLD + signal(SIGCHLD, sigchld_handler); +#endif + + zend_try { + PG(during_request_startup) = 1; + PG(modules_activated) = 0; + PG(header_is_being_sent) = 0; + PG(connection_status) = PHP_CONNECTION_NORMAL; + zend_activate(TSRMLS_C); + sapi_activate(TSRMLS_C); + zend_set_timeout(EG(timeout_seconds)); + php_hash_environment(TSRMLS_C); + zend_activate_modules(TSRMLS_C); + PG(modules_activated) = 1; + } zend_catch { + retval = FAILURE; + } zend_end_try(); + + return retval; +} +/* }}} */ + /* {{{ php_request_shutdown_for_exec */ void php_request_shutdown_for_exec(void *dummy) @@ -877,6 +906,45 @@ } /* }}} */ +/* {{{ php_request_shutdown_for_hook + */ +void php_request_shutdown_for_hook(void *dummy) +{ + TSRMLS_FETCH(); + + if (PG(modules_activated)) zend_try { + php_call_shutdown_functions(); + } zend_end_try(); + + if (PG(modules_activated)) { + zend_deactivate_modules(TSRMLS_C); + } + + zend_try { + int i; + + for (i = 0; i < NUM_TRACK_VARS; i++) { + zval_ptr_dtor(&PG(http_globals)[i]); + } + } zend_end_try(); + + zend_deactivate(TSRMLS_C); + + zend_try { + sapi_deactivate(TSRMLS_C); + } zend_end_try(); + + zend_try { + shutdown_memory_manager(CG(unclean_shutdown), 0); + } zend_end_try(); + + zend_try { + zend_unset_timeout(TSRMLS_C); + } zend_end_try(); +} + +/* }}} */ + /* {{{ php_request_shutdown */ void php_request_shutdown(void *dummy) @@ -1528,6 +1596,41 @@ } free_alloca(old_cwd); return retval; +} +/* }}} */ + +/* {{{ php_execute_simple_script + */ +PHPAPI int php_execute_simple_script(zend_file_handle *primary_file, zval **ret TSRMLS_DC) +{ + char *old_cwd; + + EG(exit_status) = 0; +#define OLD_CWD_SIZE 4096 + old_cwd = do_alloca(OLD_CWD_SIZE); + old_cwd[0] = '\0'; + + zend_try { +#ifdef PHP_WIN32 + UpdateIniFromRegistry(primary_file->filename TSRMLS_CC); +#endif + + PG(during_request_startup) = 0; + + if (primary_file->type == ZEND_HANDLE_FILENAME + && primary_file->filename) { + VCWD_GETCWD(old_cwd, OLD_CWD_SIZE-1); + VCWD_CHDIR_FILE(primary_file->filename); + } + zend_execute_scripts(ZEND_REQUIRE TSRMLS_CC, ret, 1, primary_file); + } zend_end_try(); + + if (old_cwd[0] != '\0') { + VCWD_CHDIR(old_cwd); + } + + free_alloca(old_cwd); + return EG(exit_status); } /* }}} */ Index: main/php_main.h =================================================================== RCS file: /repository/php4/main/php_main.h,v retrieving revision 1.22 diff -u -r1.22 php_main.h --- main/php_main.h 2 Aug 2002 06:53:48 -0000 1.22 +++ main/php_main.h 26 Aug 2002 09:26:58 -0000 @@ -29,7 +29,9 @@ #include "SAPI.h" PHPAPI int php_request_startup(TSRMLS_D); +PHPAPI int php_request_startup_for_hook(TSRMLS_D); PHPAPI void php_request_shutdown(void *dummy); +PHPAPI void php_request_shutdown_for_hook(void *dummy); PHPAPI void php_request_shutdown_for_exec(void *dummy); PHPAPI int php_module_startup(sapi_module_struct *sf); PHPAPI void php_module_shutdown(TSRMLS_D); @@ -39,6 +41,7 @@ PHPAPI int php_startup_extensions(zend_module_entry **ptr, int count); PHPAPI int php_execute_script(zend_file_handle *primary_file TSRMLS_DC); +PHPAPI int php_execute_simple_script(zend_file_handle *primary_file, zval **ret TSRMLS_DC); PHPAPI int php_handle_special_queries(TSRMLS_D); PHPAPI int php_lint_script(zend_file_handle *file TSRMLS_DC);