Annotation of embedaddon/php/sapi/phttpd/phttpd.c, revision 1.1.1.1
1.1 misho 1: /*
2: +----------------------------------------------------------------------+
3: | PHP Version 5 |
4: +----------------------------------------------------------------------+
5: | Copyright (c) 1997-2012 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: | Author: Thies C. Arntzen <thies@thieso.net> |
16: | Based on aolserver SAPI by Sascha Schumann <sascha@schumann.cx> |
17: +----------------------------------------------------------------------+
18: */
19:
20: #include "php.h"
21: #include "SAPI.h"
22: #include "php_main.h"
23:
24: #ifdef HAVE_PHTTPD
25:
26: #include "ext/standard/info.h"
27:
28: #ifndef ZTS
29: #error PHTTPD module is only useable in thread-safe mode
30: #endif
31:
32: #include "php_phttpd.h"
33:
34: typedef struct {
35: struct connectioninfo *cip;
36: struct stat sb;
37: } phttpd_globals_struct;
38:
39: static int ph_globals_id;
40:
41: #define PHG(v) TSRMG(ph_globals_id, phttpd_globals_struct *, v)
42:
43: static int
44: php_phttpd_startup(sapi_module_struct *sapi_module)
45: {
46: fprintf(stderr,"***php_phttpd_startup\n");
47:
48: if (php_module_startup(sapi_module, NULL, 0)) {
49: return FAILURE;
50: } else {
51: return SUCCESS;
52: }
53: }
54:
55: static int
56: php_phttpd_sapi_ub_write(const char *str, uint str_length TSRMLS_DC)
57: {
58: int sent_bytes;
59:
60: sent_bytes = fd_write(PHG(cip)->fd, str, str_length);
61:
62: if (sent_bytes == -1) {
63: php_handle_aborted_connection();
64: }
65:
66: return sent_bytes;
67: }
68:
69: static int
70: php_phttpd_sapi_header_handler(sapi_header_struct *sapi_header, sapi_headers_struct *sapi_headers TSRMLS_DC)
71: {
72: char *header_name, *header_content;
73: char *p;
74: TSRMLS_FETCH();
75:
76: http_sendheaders(PHG(cip)->fd, PHG(cip), SG(sapi_headers).http_response_code, NULL);
77:
78: header_name = sapi_header->header;
79: header_content = p = strchr(header_name, ':');
80:
81: if (p) {
82: *p = '\0';
83: do {
84: header_content++;
85: } while (*header_content == ' ');
86:
87: fd_printf(PHG(cip)->fd,"%s: %s\n", header_name, header_content);
88:
89: *p = ':';
90: }
91:
92: sapi_free_header(sapi_header);
93:
94: return 0;
95: }
96:
97: static int
98: php_phttpd_sapi_send_headers(sapi_headers_struct *sapi_headers TSRMLS_DC)
99: {
100: TSRMLS_FETCH();
101:
102: if (SG(sapi_headers).send_default_content_type) {
103: fd_printf(PHG(cip)->fd,"Content-Type: text/html\n");
104: }
105:
106: fd_putc('\n', PHG(cip)->fd);
107:
108: return SAPI_HEADER_SENT_SUCCESSFULLY;
109: }
110:
111: static char *
112: php_phttpd_sapi_read_cookies(TSRMLS_D)
113: {
114:
115: /*
116: int i;
117: char *http_cookie = NULL;
118: NTSRMLS_FETCH();
119:
120: i = Ns_SetIFind(NSG(conn->headers), "cookie");
121: if(i != -1) {
122: http_cookie = Ns_SetValue(NSG(conn->headers), i);
123: }
124:
125: return http_cookie;
126: */
127: fprintf(stderr,"***php_phttpd_sapi_read_cookies\n");
128:
129: return 0;
130: }
131:
132: static int
133: php_phttpd_sapi_read_post(char *buf, uint count_bytes TSRMLS_DC)
134: {
135: /*
136: uint max_read;
137: uint total_read = 0;
138: NTSRMLS_FETCH();
139:
140: max_read = MIN(NSG(data_avail), count_bytes);
141:
142: total_read = Ns_ConnRead(NSG(conn), buf, max_read);
143:
144: if(total_read == NS_ERROR) {
145: total_read = -1;
146: } else {
147: NSG(data_avail) -= total_read;
148: }
149:
150: return total_read;
151: */
152: fprintf(stderr,"***php_phttpd_sapi_read_post\n");
153: return 0;
154: }
155:
156: static sapi_module_struct phttpd_sapi_module = {
157: "phttpd",
158: "PHTTPD",
159:
160: php_phttpd_startup, /* startup */
161: php_module_shutdown_wrapper, /* shutdown */
162:
163: NULL, /* activate */
164: NULL, /* deactivate */
165:
166: php_phttpd_sapi_ub_write, /* unbuffered write */
167: NULL, /* flush */
168: NULL, /* get uid */
169: NULL, /* getenv */
170:
171: php_error, /* error handler */
172:
173: php_phttpd_sapi_header_handler, /* header handler */
174: php_phttpd_sapi_send_headers, /* send headers handler */
175: NULL, /* send header handler */
176:
177: php_phttpd_sapi_read_post, /* read POST data */
178: php_phttpd_sapi_read_cookies, /* read Cookies */
179:
180: NULL, /* register server variables */
181: NULL, /* Log message */
182: NULL, /* Get request time */
183: NULL, /* Child terminate */
184:
185: STANDARD_SAPI_MODULE_PROPERTIES
186: };
187:
188: static void
189: php_phttpd_request_ctor(TSRMLS_D TSRMLS_DC)
190: {
191: memset(&SG(request_info), 0, sizeof(sapi_globals_struct)); /* pfusch! */
192:
193: SG(request_info).query_string = PHG(cip)->hip->request;
194: SG(request_info).request_method = PHG(cip)->hip->method;
195: SG(request_info).path_translated = malloc(MAXPATHLEN);
196: SG(sapi_headers).http_response_code = 200;
197: if (url_expand(PHG(cip)->hip->url, SG(request_info).path_translated, MAXPATHLEN, &PHG(sb), NULL, NULL) == NULL) {
198: /* handle error */
199: }
200:
201: #if 0
202: char *server;
203: Ns_DString ds;
204: char *root;
205: int index;
206: char *tmp;
207:
208: server = Ns_ConnServer(NSG(conn));
209:
210: Ns_DStringInit(&ds);
211: Ns_UrlToFile(&ds, server, NSG(conn->request->url));
212:
213: /* path_translated is the absolute path to the file */
214: SG(request_info).path_translated = strdup(Ns_DStringValue(&ds));
215: Ns_DStringFree(&ds);
216: root = Ns_PageRoot(server);
217: SG(request_info).request_uri = SG(request_info).path_translated + strlen(root);
218: SG(request_info).content_length = Ns_ConnContentLength(NSG(conn));
219: index = Ns_SetIFind(NSG(conn)->headers, "content-type");
220: SG(request_info).content_type = index == -1 ? NULL :
221: Ns_SetValue(NSG(conn)->headers, index);
222:
223: tmp = Ns_ConnAuthUser(NSG(conn));
224: if(tmp) {
225: tmp = estrdup(tmp);
226: }
227: SG(request_info).auth_user = tmp;
228:
229: tmp = Ns_ConnAuthPasswd(NSG(conn));
230: if(tmp) {
231: tmp = estrdup(tmp);
232: }
233: SG(request_info).auth_password = tmp;
234:
235: NSG(data_avail) = SG(request_info).content_length;
236: #endif
237: }
238:
239: static void
240: php_phttpd_request_dtor(TSRMLS_D TSRMLS_DC)
241: {
242: free(SG(request_info).path_translated);
243: }
244:
245:
246: int php_doit(TSRMLS_D TSRMLS_DC)
247: {
248: struct stat sb;
249: zend_file_handle file_handle;
250: struct httpinfo *hip = PHG(cip)->hip;
251: TSRMLS_FETCH();
252:
253: if (php_request_startup(TSRMLS_C) == FAILURE) {
254: return -1;
255: }
256:
257: file_handle.type = ZEND_HANDLE_FILENAME;
258: file_handle.filename = SG(request_info).path_translated;
259: file_handle.free_filename = 0;
260:
261: /*
262: php_phttpd_hash_environment(TSRMLS_C);
263: */
264: php_execute_script(&file_handle TSRMLS_CC);
265: php_request_shutdown(NULL);
266:
267: return SG(sapi_headers).http_response_code;
268: }
269:
270: int pm_init(const char **argv)
271: {
272: tsrm_startup(1, 1, 0, NULL);
273: sapi_startup(&phttpd_sapi_module);
274: phttpd_sapi_module.startup(&phttpd_sapi_module);
275:
276: ts_allocate_id(&ph_globals_id, sizeof(phttpd_globals_struct), NULL, NULL);
277:
278: return 0;
279: }
280:
281: void pm_exit(void)
282: {
283: fprintf(stderr,"***pm_exit\n");
284: }
285:
286: int pm_request(struct connectioninfo *cip)
287: {
288: struct httpinfo *hip = cip->hip;
289: int status;
290: TSRMLS_FETCH();
291:
292: if (strcasecmp(hip->method, "GET") == 0 ||
293: strcasecmp(hip->method, "HEAD") == 0 ||
294: strcasecmp(hip->method, "POST") == 0) {
295: PHG(cip) = cip;
296:
297: php_phttpd_request_ctor(TSRMLS_C);
298: status = php_doit(TSRMLS_C);
299: php_phttpd_request_dtor(TSRMLS_C);
300:
301: return status;
302: } else {
303: return -2;
304: }
305: }
306:
307: #endif
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>