xref: /PHP-5.5/sapi/apache_hooks/sapi_apache.c (revision 73c1be26)
1 /*
2    +----------------------------------------------------------------------+
3    | PHP Version 5                                                        |
4    +----------------------------------------------------------------------+
5    | Copyright (c) 1997-2015 The PHP Group                                |
6    +----------------------------------------------------------------------+
7    | This source file is subject to version 3.01 of the PHP license,      |
8    | that is bundled with this package in the file LICENSE, and is        |
9    | available through the world-wide-web at the following url:           |
10    | http://www.php.net/license/3_01.txt                                  |
11    | If you did not receive a copy of the PHP license and are unable to   |
12    | obtain it through the world-wide-web, please send a note to          |
13    | license@php.net so we can mail you a copy immediately.               |
14    +----------------------------------------------------------------------+
15    | Authors: Rasmus Lerdorf <rasmus@php.net>                             |
16    | (with helpful hints from Dean Gaudet <dgaudet@arctic.org>            |
17    | PHP 4.0 patches by:                                                  |
18    | Zeev Suraski <zeev@zend.com>                                         |
19    | Stig Bakken <ssb@php.net>                                            |
20    +----------------------------------------------------------------------+
21  */
22 /* $Id$ */
23 
24 #include "php_apache_http.h"
25 
26 /* {{{ apache_php_module_main
27  */
apache_php_module_main(request_rec * r,int display_source_mode TSRMLS_DC)28 int apache_php_module_main(request_rec *r, int display_source_mode TSRMLS_DC)
29 {
30 	zend_file_handle file_handle;
31 
32 	if (php_request_startup(TSRMLS_C) == FAILURE) {
33 		return FAILURE;
34 	}
35 	/* sending a file handle to another dll is not working
36 	   so let zend open it. */
37 
38 	if (display_source_mode) {
39 		zend_syntax_highlighter_ini syntax_highlighter_ini;
40 
41 		php_get_highlight_struct(&syntax_highlighter_ini);
42 		if (highlight_file(SG(request_info).path_translated, &syntax_highlighter_ini TSRMLS_CC)){
43 			return OK;
44 		} else {
45 			return NOT_FOUND;
46 		}
47 	} else {
48 		file_handle.type = ZEND_HANDLE_FILENAME;
49 		file_handle.handle.fd = 0;
50 		file_handle.filename = SG(request_info).path_translated;
51 		file_handle.opened_path = NULL;
52 		file_handle.free_filename = 0;
53 		(void) php_execute_script(&file_handle TSRMLS_CC);
54 	}
55 	AP(in_request) = 0;
56 
57 	return (OK);
58 }
59 /* }}} */
60 
61 /* {{{ apache_php_module_hook
62  */
apache_php_module_hook(request_rec * r,php_handler * handler,zval ** ret TSRMLS_DC)63 int apache_php_module_hook(request_rec *r, php_handler *handler, zval **ret TSRMLS_DC)
64 {
65 	zend_file_handle file_handle;
66 	zval *req;
67     char *tmp;
68 
69 #if PHP_SIGCHILD
70 	signal(SIGCHLD, sigchld_handler);
71 #endif
72     if(AP(current_hook) == AP_RESPONSE) {
73         if (php_request_startup_for_hook(TSRMLS_C) == FAILURE)
74             return FAILURE;
75     }
76     else {
77         if (php_request_startup_for_hook(TSRMLS_C) == FAILURE)
78             return FAILURE;
79     }
80 
81     req = php_apache_request_new(r);
82     php_register_variable_ex("request", req, PG(http_globals)[TRACK_VARS_SERVER] TSRMLS_CC);
83 
84     switch(handler->type) {
85         case AP_HANDLER_TYPE_FILE:
86             php_register_variable("PHP_SELF_HOOK", handler->name, PG(http_globals)[TRACK_VARS_SERVER] TSRMLS_CC);
87 	        memset(&file_handle, 0, sizeof(file_handle));
88 	        file_handle.type = ZEND_HANDLE_FILENAME;
89 	        file_handle.filename = handler->name;
90 	        (void) php_execute_simple_script(&file_handle, ret TSRMLS_CC);
91             break;
92         case AP_HANDLER_TYPE_METHOD:
93             if( (tmp = strstr(handler->name, "::")) != NULL &&  *(tmp+2) != '\0' ) {
94                 zval *class;
95                 zval *method;
96                 *tmp = '\0';
97                 ALLOC_ZVAL(class);
98                 ZVAL_STRING(class, handler->name, 1);
99                 ALLOC_ZVAL(method);
100                 ZVAL_STRING(method, tmp +2, 1);
101                 *tmp = ':';
102                 call_user_function_ex(EG(function_table), &class, method, ret, 0, NULL, 0, NULL TSRMLS_CC);
103                 zval_dtor(class);
104                 zval_dtor(method);
105             }
106             else {
107                 php_error(E_ERROR, "Unable to call %s - not a Class::Method\n", handler->name);
108                 /* not a class::method */
109             }
110             break;
111         default:
112             /* not a valid type */
113             assert(0);
114             break;
115     }
116 	zval_dtor(req);
117 	AP(in_request) = 0;
118 
119 	return OK;
120 }
121 
122 /* }}} */
123 
124 /*
125  * Local variables:
126  * tab-width: 4
127  * c-basic-offset: 4
128  * End:
129  * vim600: sw=4 ts=4 fdm=marker
130  * vim<600: sw=4 ts=4
131  */
132