1 : /*
2 : +--------------------------------------------------------------------+
3 : | PECL :: http |
4 : +--------------------------------------------------------------------+
5 : | Redistribution and use in source and binary forms, with or without |
6 : | modification, are permitted provided that the conditions mentioned |
7 : | in the accompanying LICENSE file are met. |
8 : +--------------------------------------------------------------------+
9 : | Copyright (c) 2004-2007, Michael Wallner <mike@php.net> |
10 : +--------------------------------------------------------------------+
11 : */
12 :
13 : /* $Id: http.c,v 1.194 2007/02/09 21:35:50 mike Exp $ */
14 :
15 : #define HTTP_WANT_SAPI
16 : #define HTTP_WANT_CURL
17 : #define HTTP_WANT_ZLIB
18 : #define HTTP_WANT_MAGIC
19 : #include "php_http.h"
20 :
21 : #include "php_ini.h"
22 : #include "ext/standard/info.h"
23 : #include "zend_extensions.h"
24 :
25 : #include "php_http_api.h"
26 : #include "php_http_cache_api.h"
27 : #include "php_http_cookie_api.h"
28 : #include "php_http_encoding_api.h"
29 : #include "php_http_filter_api.h"
30 : #include "php_http_message_api.h"
31 : #include "php_http_persistent_handle_api.h"
32 : #include "php_http_request_api.h"
33 : #include "php_http_request_datashare_api.h"
34 : #include "php_http_request_method_api.h"
35 : #include "php_http_request_pool_api.h"
36 : #include "php_http_send_api.h"
37 : #include "php_http_url_api.h"
38 :
39 : #include "php_http_deflatestream_object.h"
40 : #include "php_http_exception_object.h"
41 : #include "php_http_inflatestream_object.h"
42 : #include "php_http_message_object.h"
43 : #include "php_http_querystring_object.h"
44 : #include "php_http_request_object.h"
45 : #include "php_http_requestdatashare_object.h"
46 : #include "php_http_requestpool_object.h"
47 : #include "php_http_response_object.h"
48 : #include "php_http_util_object.h"
49 :
50 : ZEND_DECLARE_MODULE_GLOBALS(http);
51 : HTTP_DECLARE_ARG_PASS_INFO();
52 :
53 : #ifdef COMPILE_DL_HTTP
54 : ZEND_GET_MODULE(http)
55 : #endif
56 :
57 : /* {{{ http_functions[] */
58 : zend_function_entry http_functions[] = {
59 : PHP_FE(http_date, NULL)
60 : PHP_FE(http_build_url, http_arg_pass_ref_4)
61 : PHP_FE(http_build_str, NULL)
62 : #ifndef ZEND_ENGINE_2
63 : PHP_FALIAS(http_build_query, http_build_str, NULL)
64 : #endif
65 : PHP_FE(http_negotiate_language, http_arg_pass_ref_2)
66 : PHP_FE(http_negotiate_charset, http_arg_pass_ref_2)
67 : PHP_FE(http_negotiate_content_type, http_arg_pass_ref_2)
68 : PHP_FE(http_redirect, NULL)
69 : PHP_FE(http_throttle, NULL)
70 : PHP_FE(http_send_status, NULL)
71 : PHP_FE(http_send_last_modified, NULL)
72 : PHP_FE(http_send_content_type, NULL)
73 : PHP_FE(http_send_content_disposition, NULL)
74 : PHP_FE(http_match_modified, NULL)
75 : PHP_FE(http_match_etag, NULL)
76 : PHP_FE(http_cache_last_modified, NULL)
77 : PHP_FE(http_cache_etag, NULL)
78 : PHP_FE(http_send_data, NULL)
79 : PHP_FE(http_send_file, NULL)
80 : PHP_FE(http_send_stream, NULL)
81 : PHP_FE(http_chunked_decode, NULL)
82 : PHP_FE(http_parse_message, NULL)
83 : PHP_FE(http_parse_headers, NULL)
84 : PHP_FE(http_parse_cookie, NULL)
85 : PHP_FE(http_build_cookie, NULL)
86 : PHP_FE(http_parse_params, NULL)
87 : PHP_FE(http_get_request_headers, NULL)
88 : PHP_FE(http_get_request_body, NULL)
89 : PHP_FE(http_get_request_body_stream, NULL)
90 : PHP_FE(http_match_request_header, NULL)
91 : PHP_FE(http_persistent_handles_count, NULL)
92 : PHP_FE(http_persistent_handles_clean, NULL)
93 : PHP_FE(http_persistent_handles_ident, NULL)
94 : #ifdef HTTP_HAVE_CURL
95 : PHP_FE(http_get, http_arg_pass_ref_3)
96 : PHP_FE(http_head, http_arg_pass_ref_3)
97 : PHP_FE(http_post_data, http_arg_pass_ref_4)
98 : PHP_FE(http_post_fields, http_arg_pass_ref_5)
99 : PHP_FE(http_put_data, http_arg_pass_ref_4)
100 : PHP_FE(http_put_file, http_arg_pass_ref_4)
101 : PHP_FE(http_put_stream, http_arg_pass_ref_4)
102 : PHP_FE(http_request, http_arg_pass_ref_5)
103 : PHP_FE(http_request_body_encode, NULL)
104 : #endif
105 : PHP_FE(http_request_method_register, NULL)
106 : PHP_FE(http_request_method_unregister, NULL)
107 : PHP_FE(http_request_method_exists, NULL)
108 : PHP_FE(http_request_method_name, NULL)
109 : PHP_FE(ob_etaghandler, NULL)
110 : #ifdef HTTP_HAVE_ZLIB
111 : PHP_FE(http_deflate, NULL)
112 : PHP_FE(http_inflate, NULL)
113 : PHP_FE(ob_deflatehandler, NULL)
114 : PHP_FE(ob_inflatehandler, NULL)
115 : #endif
116 : PHP_FE(http_support, NULL)
117 :
118 : EMPTY_FUNCTION_ENTRY
119 : };
120 : /* }}} */
121 :
122 : PHP_MINIT_FUNCTION(http);
123 : PHP_MSHUTDOWN_FUNCTION(http);
124 : PHP_RINIT_FUNCTION(http);
125 : PHP_RSHUTDOWN_FUNCTION(http);
126 : PHP_MINFO_FUNCTION(http);
127 :
128 : /* {{{ http_module_dep */
129 : #if ZEND_EXTENSION_API_NO >= 220050617
130 : static zend_module_dep http_module_deps[] = {
131 : # ifdef HTTP_HAVE_SPL
132 : ZEND_MOD_REQUIRED("spl")
133 : # endif
134 : # ifdef HTTP_HAVE_HASH
135 : ZEND_MOD_REQUIRED("hash")
136 : # endif
137 : # ifdef HTTP_HAVE_SESSION
138 : ZEND_MOD_REQUIRED("session")
139 : # endif
140 : # ifdef HTTP_HAVE_ICONV
141 : ZEND_MOD_REQUIRED("iconv")
142 : # endif
143 : {NULL, NULL, NULL, 0}
144 : };
145 : #endif
146 : /* }}} */
147 :
148 : /* {{{ http_module_entry */
149 : zend_module_entry http_module_entry = {
150 : #if ZEND_EXTENSION_API_NO >= 220050617
151 : STANDARD_MODULE_HEADER_EX, NULL,
152 : http_module_deps,
153 : #else
154 : STANDARD_MODULE_HEADER,
155 : #endif
156 : "http",
157 : http_functions,
158 : PHP_MINIT(http),
159 : PHP_MSHUTDOWN(http),
160 : PHP_RINIT(http),
161 : PHP_RSHUTDOWN(http),
162 : PHP_MINFO(http),
163 : PHP_EXT_HTTP_VERSION,
164 : STANDARD_MODULE_PROPERTIES
165 : };
166 : /* }}} */
167 :
168 : int http_module_number;
169 :
170 : /* {{{ http_globals */
171 : static void http_globals_init_once(zend_http_globals *G)
172 220 : {
173 220 : memset(G, 0, sizeof(zend_http_globals));
174 220 : }
175 :
176 : #define http_globals_init(g) _http_globals_init((g) TSRMLS_CC)
177 : static inline void _http_globals_init(zend_http_globals *G TSRMLS_DC)
178 219 : {
179 : #ifdef HTTP_HAVE_SAPI_RTIME
180 : G->request.time = sapi_get_request_time(TSRMLS_C);
181 : #else
182 219 : G->request.time = time(NULL);
183 : #endif
184 219 : G->send.buffer_size = 0;
185 219 : G->read_post_data = 0;
186 219 : }
187 :
188 : #define http_globals_free(g) _http_globals_free((g) TSRMLS_CC)
189 : static inline void _http_globals_free(zend_http_globals *G TSRMLS_DC)
190 219 : {
191 219 : if (G->request.headers) {
192 1 : zend_hash_destroy(G->request.headers);
193 1 : FREE_HASHTABLE(G->request.headers);
194 1 : G->request.headers = NULL;
195 : }
196 219 : STR_SET(G->send.content_type, NULL);
197 219 : STR_SET(G->send.unquoted_etag, NULL);
198 219 : if (G->server_var) {
199 28 : zval_ptr_dtor(&G->server_var);
200 28 : G->server_var = NULL;
201 : }
202 219 : }
203 : /* }}} */
204 :
205 : /* {{{ static inline void http_check_allowed_methods(char *) */
206 : #define http_check_allowed_methods(m) _http_check_allowed_methods((m) TSRMLS_CC)
207 : static inline void _http_check_allowed_methods(const char *methods TSRMLS_DC)
208 1 : {
209 1 : if (*methods && SG(request_info).request_method) {
210 1 : if (SUCCESS != http_check_method_ex(SG(request_info).request_method, methods)) {
211 : char *header;
212 1 : spprintf(&header, 0, "Allow: %s", methods);
213 1 : http_exit(405, header);
214 : }
215 : }
216 0 : }
217 : /* }}} */
218 :
219 : /* {{{ PHP_INI */
220 : PHP_INI_MH(http_update_allowed_methods)
221 221 : {
222 221 : if (*new_value) {
223 1 : http_check_allowed_methods(new_value);
224 : }
225 220 : return OnUpdateString(entry, new_value, new_value_length, mh_arg1, mh_arg2, mh_arg3, stage TSRMLS_CC);
226 : }
227 : PHP_INI_MH(http_update_persistent_handle_ident)
228 220 : {
229 220 : HTTP_G->persistent.handles.ident.h = zend_hash_func(new_value, HTTP_G->persistent.handles.ident.l = new_value_length+1);
230 220 : return OnUpdateString(entry, new_value, new_value_length, mh_arg1, mh_arg2, mh_arg3, stage TSRMLS_CC);
231 : }
232 :
233 : #ifndef ZEND_ENGINE_2
234 : # define OnUpdateLong OnUpdateInt
235 : #endif
236 :
237 : PHP_INI_BEGIN()
238 : HTTP_PHP_INI_ENTRY("http.etag.mode", "MD5", PHP_INI_ALL, OnUpdateString, etag.mode)
239 : HTTP_PHP_INI_ENTRY("http.log.cache", "", PHP_INI_ALL, OnUpdateString, log.cache)
240 : HTTP_PHP_INI_ENTRY("http.log.redirect", "", PHP_INI_ALL, OnUpdateString, log.redirect)
241 : HTTP_PHP_INI_ENTRY("http.log.not_found", "", PHP_INI_ALL, OnUpdateString, log.not_found)
242 : HTTP_PHP_INI_ENTRY("http.log.allowed_methods", "", PHP_INI_ALL, OnUpdateString, log.allowed_methods)
243 : HTTP_PHP_INI_ENTRY("http.log.composite", "", PHP_INI_ALL, OnUpdateString, log.composite)
244 : HTTP_PHP_INI_ENTRY("http.request.methods.allowed", "", PHP_INI_ALL, http_update_allowed_methods, request.methods.allowed)
245 : HTTP_PHP_INI_ENTRY("http.request.methods.custom", "", PHP_INI_PERDIR|PHP_INI_SYSTEM, OnUpdateString, request.methods.custom.ini)
246 : #if defined(ZEND_ENGINE_2) && defined(HTTP_HAVE_CURL)
247 : HTTP_PHP_INI_ENTRY("http.request.datashare.cookie", "0", PHP_INI_SYSTEM, OnUpdateBool, request.datashare.cookie)
248 : HTTP_PHP_INI_ENTRY("http.request.datashare.dns", "1", PHP_INI_SYSTEM, OnUpdateBool, request.datashare.dns)
249 : HTTP_PHP_INI_ENTRY("http.request.datashare.ssl", "0", PHP_INI_SYSTEM, OnUpdateBool, request.datashare.ssl)
250 : HTTP_PHP_INI_ENTRY("http.request.datashare.connect", "0", PHP_INI_SYSTEM, OnUpdateBool, request.datashare.connect)
251 : #endif
252 : #ifdef HTTP_HAVE_ZLIB
253 : HTTP_PHP_INI_ENTRY("http.send.inflate.start_auto", "0", PHP_INI_PERDIR|PHP_INI_SYSTEM, OnUpdateBool, send.inflate.start_auto)
254 : HTTP_PHP_INI_ENTRY("http.send.inflate.start_flags", "0", PHP_INI_ALL, OnUpdateLong, send.inflate.start_flags)
255 : HTTP_PHP_INI_ENTRY("http.send.deflate.start_auto", "0", PHP_INI_PERDIR|PHP_INI_SYSTEM, OnUpdateBool, send.deflate.start_auto)
256 : HTTP_PHP_INI_ENTRY("http.send.deflate.start_flags", "0", PHP_INI_ALL, OnUpdateLong, send.deflate.start_flags)
257 : #endif
258 : HTTP_PHP_INI_ENTRY("http.persistent.handles.limit", "-1", PHP_INI_SYSTEM, OnUpdateLong, persistent.handles.limit)
259 : HTTP_PHP_INI_ENTRY("http.persistent.handles.ident", "GLOBAL", PHP_INI_ALL, http_update_persistent_handle_ident, persistent.handles.ident.s)
260 : HTTP_PHP_INI_ENTRY("http.send.not_found_404", "1", PHP_INI_ALL, OnUpdateBool, send.not_found_404)
261 : #ifdef ZEND_ENGINE_2
262 : HTTP_PHP_INI_ENTRY("http.only_exceptions", "0", PHP_INI_ALL, OnUpdateBool, only_exceptions)
263 : #endif
264 : HTTP_PHP_INI_ENTRY("http.force_exit", "1", PHP_INI_ALL, OnUpdateBool, force_exit)
265 : PHP_INI_END()
266 : /* }}} */
267 :
268 : /* {{{ PHP_MINIT_FUNCTION */
269 : PHP_MINIT_FUNCTION(http)
270 220 : {
271 220 : http_module_number = module_number;
272 220 : ZEND_INIT_MODULE_GLOBALS(http, http_globals_init_once, NULL);
273 220 : REGISTER_INI_ENTRIES();
274 :
275 220 : if (0
276 : || SUCCESS != PHP_MINIT_CALL(http_persistent_handle) /* first */
277 : || SUCCESS != PHP_MINIT_CALL(http_cookie)
278 : #ifdef HTTP_HAVE_ZLIB
279 : || SUCCESS != PHP_MINIT_CALL(http_encoding)
280 : #endif
281 : #ifdef HTTP_HAVE_CURL
282 : || SUCCESS != PHP_MINIT_CALL(http_request)
283 : # ifdef ZEND_ENGINE_2
284 : # endif
285 : #endif
286 : || SUCCESS != PHP_MINIT_CALL(http_request_method)
287 : || SUCCESS != PHP_MINIT_CALL(http_send)
288 : || SUCCESS != PHP_MINIT_CALL(http_support)
289 : || SUCCESS != PHP_MINIT_CALL(http_url)
290 :
291 : #ifdef ZEND_ENGINE_2
292 : || SUCCESS != PHP_MINIT_CALL(http_filter)
293 : || SUCCESS != PHP_MINIT_CALL(http_exception_object)
294 : # ifdef HTTP_HAVE_ZLIB
295 : || SUCCESS != PHP_MINIT_CALL(http_deflatestream_object)
296 : || SUCCESS != PHP_MINIT_CALL(http_inflatestream_object)
297 : # endif
298 : || SUCCESS != PHP_MINIT_CALL(http_message_object)
299 : || SUCCESS != PHP_MINIT_CALL(http_querystring_object)
300 : # ifdef HTTP_HAVE_CURL
301 : || SUCCESS != PHP_MINIT_CALL(http_request_datashare)
302 : || SUCCESS != PHP_MINIT_CALL(http_request_pool)
303 : || SUCCESS != PHP_MINIT_CALL(http_request_object)
304 : || SUCCESS != PHP_MINIT_CALL(http_requestdatashare_object)
305 : || SUCCESS != PHP_MINIT_CALL(http_requestpool_object)
306 : # endif
307 : # ifndef WONKY
308 : || SUCCESS != PHP_MINIT_CALL(http_response_object)
309 : # endif
310 : || SUCCESS != PHP_MINIT_CALL(http_util_object)
311 : #endif
312 : ) {
313 0 : return FAILURE;
314 : }
315 :
316 220 : return SUCCESS;
317 : }
318 : /* }}} */
319 :
320 : /* {{{ PHP_MSHUTDOWN_FUNCTION */
321 : PHP_MSHUTDOWN_FUNCTION(http)
322 219 : {
323 219 : UNREGISTER_INI_ENTRIES();
324 :
325 219 : if (0
326 : #ifdef HTTP_HAVE_CURL
327 : || SUCCESS != PHP_MSHUTDOWN_CALL(http_request)
328 : # ifdef ZEND_ENGINE_2
329 : || SUCCESS != PHP_MSHUTDOWN_CALL(http_request_datashare)
330 : # endif
331 : #endif
332 : || SUCCESS != PHP_MSHUTDOWN_CALL(http_persistent_handle) /* last */
333 : ) {
334 0 : return FAILURE;
335 : }
336 :
337 219 : return SUCCESS;
338 : }
339 : /* }}} */
340 :
341 : /* {{{ PHP_RINIT_FUNCTION */
342 : PHP_RINIT_FUNCTION(http)
343 219 : {
344 219 : http_globals_init(HTTP_G);
345 :
346 219 : if (HTTP_G->request.methods.allowed && *HTTP_G->request.methods.allowed) {
347 0 : http_check_allowed_methods(HTTP_G->request.methods.allowed);
348 : }
349 :
350 219 : if (0
351 : #ifdef HTTP_HAVE_ZLIB
352 : || SUCCESS != PHP_RINIT_CALL(http_encoding)
353 : #endif
354 : #ifdef HTTP_HAVE_CURL
355 : # ifdef ZEND_ENGINE_2
356 : || SUCCESS != PHP_RINIT_CALL(http_request_datashare)
357 : # endif
358 : #endif
359 : || SUCCESS != PHP_RINIT_CALL(http_request_method)
360 : ) {
361 0 : return FAILURE;
362 : }
363 :
364 219 : return SUCCESS;
365 : }
366 : /* }}} */
367 :
368 : /* {{{ PHP_RSHUTDOWN_FUNCTION */
369 : PHP_RSHUTDOWN_FUNCTION(http)
370 219 : {
371 219 : STATUS status = SUCCESS;
372 :
373 219 : if (0
374 : #ifdef HTTP_HAVE_ZLIB
375 : || SUCCESS != PHP_RSHUTDOWN_CALL(http_encoding)
376 : #endif
377 : #ifdef HTTP_HAVE_CURL
378 : # ifdef ZEND_ENGINE_2
379 : || SUCCESS != PHP_RSHUTDOWN_CALL(http_request_datashare)
380 : # endif
381 : #endif
382 : || SUCCESS != PHP_RSHUTDOWN_CALL(http_request_method)
383 : ) {
384 0 : status = FAILURE;
385 : }
386 :
387 219 : http_globals_free(HTTP_G);
388 219 : return status;
389 : }
390 : /* }}} */
391 :
392 : /* {{{ PHP_MINFO_FUNCTION */
393 : PHP_MINFO_FUNCTION(http)
394 0 : {
395 0 : php_info_print_table_start();
396 : {
397 0 : php_info_print_table_row(2, "HTTP Support", "enabled");
398 0 : php_info_print_table_row(2, "Extension Version", PHP_EXT_HTTP_VERSION);
399 0 : php_info_print_table_row(2, "Registered Classes",
400 : #ifndef ZEND_ENGINE_2
401 : "none"
402 : #else
403 : "HttpUtil, "
404 : "HttpMessage, "
405 : # ifdef HTTP_HAVE_CURL
406 : "HttpRequest, "
407 : "HttpRequestPool, "
408 : "HttpRequestDataShare, "
409 : # endif
410 : # ifdef HTTP_HAVE_ZLIB
411 : "HttpDeflateStream, "
412 : "HttpInflateStream, "
413 : # endif
414 : # ifndef WONKY
415 : "HttpResponse, "
416 : # endif
417 : "HttpQueryString"
418 : #endif
419 : );
420 0 : php_info_print_table_row(2, "Output Handlers", "ob_deflatehandler, ob_inflatehandler, ob_etaghandler");
421 0 : php_info_print_table_row(2, "Stream Filters",
422 : #ifndef ZEND_ENGINE_2
423 : "none"
424 : #else
425 : "http.chunked_decode, http.chunked_encode, http.deflate, http.inflate"
426 : #endif
427 : );
428 : }
429 0 : php_info_print_table_end();
430 :
431 0 : php_info_print_table_start();
432 0 : php_info_print_table_header(3, "Used Library", "Compiled", "Linked");
433 : {
434 : #ifdef HTTP_HAVE_CURL
435 0 : curl_version_info_data *cv = curl_version_info(CURLVERSION_NOW);
436 0 : php_info_print_table_row(3, "libcurl", LIBCURL_VERSION, cv->version);
437 : #else
438 : php_info_print_table_row(2, "libcurl", "disabled", "disabled");
439 : #endif
440 : #ifdef HTTP_HAVE_ZLIB
441 0 : php_info_print_table_row(3, "libz", ZLIB_VERSION, zlibVersion());
442 : #else
443 : php_info_print_table_row(3, "libz", "disabled", "disabled");
444 : #endif
445 : #if defined(HTTP_HAVE_MAGIC)
446 : php_info_print_table_row(3, "libmagic", "unknown", "unknown");
447 : #else
448 0 : php_info_print_table_row(3, "libmagic", "disabled", "disabled");
449 : #endif
450 : }
451 0 : php_info_print_table_end();
452 :
453 0 : php_info_print_table_start();
454 0 : php_info_print_table_colspan_header(4, "Persistent Handles");
455 0 : php_info_print_table_header(4, "Provider", "Ident", "Used", "Free");
456 : {
457 : HashTable *ht;
458 : HashPosition pos1, pos2;
459 0 : HashKey provider = initHashKey(0), ident = initHashKey(0);
460 : zval **val, **sub, **zused, **zfree;
461 :
462 0 : if ((ht = http_persistent_handle_statall()) && zend_hash_num_elements(ht)) {
463 0 : FOREACH_HASH_KEYVAL(pos1, ht, provider, val) {
464 0 : if (zend_hash_num_elements(Z_ARRVAL_PP(val))) {
465 0 : FOREACH_KEYVAL(pos2, *val, ident, sub) {
466 0 : if ( SUCCESS == zend_hash_find(Z_ARRVAL_PP(sub), ZEND_STRS("used"), (void *) &zused) &&
467 : SUCCESS == zend_hash_find(Z_ARRVAL_PP(sub), ZEND_STRS("free"), (void *) &zfree)) {
468 0 : convert_to_string(*zused);
469 0 : convert_to_string(*zfree);
470 0 : php_info_print_table_row(4, provider.str, ident.str, Z_STRVAL_PP(zused), Z_STRVAL_PP(zfree));
471 : } else {
472 0 : php_info_print_table_row(4, provider.str, ident.str, "0", "0");
473 : }
474 : }
475 : } else {
476 0 : php_info_print_table_row(4, provider.str, "N/A", "0", "0");
477 : }
478 : }
479 : } else {
480 0 : php_info_print_table_row(4, "N/A", "N/A", "0", "0");
481 : }
482 0 : if (ht) {
483 0 : zend_hash_destroy(ht);
484 0 : FREE_HASHTABLE(ht);
485 : }
486 : }
487 0 : php_info_print_table_end();
488 :
489 0 : php_info_print_table_start();
490 0 : php_info_print_table_colspan_header(2, "Request Methods");
491 : {
492 : int i;
493 0 : phpstr *custom_request_methods = phpstr_new();
494 0 : phpstr *known_request_methods = phpstr_from_string(HTTP_KNOWN_METHODS, lenof(HTTP_KNOWN_METHODS));
495 0 : http_request_method_entry **ptr = HTTP_G->request.methods.custom.entries;
496 :
497 0 : for (i = 0; i < HTTP_G->request.methods.custom.count; ++i) {
498 0 : if (ptr[i]) {
499 0 : phpstr_appendf(custom_request_methods, "%s, ", ptr[i]->name);
500 : }
501 : }
502 :
503 0 : phpstr_append(known_request_methods, PHPSTR_VAL(custom_request_methods), PHPSTR_LEN(custom_request_methods));
504 0 : phpstr_fix(known_request_methods);
505 0 : phpstr_fix(custom_request_methods);
506 :
507 0 : php_info_print_table_row(2, "Known", PHPSTR_VAL(known_request_methods));
508 0 : php_info_print_table_row(2, "Custom",
509 : PHPSTR_LEN(custom_request_methods) ? PHPSTR_VAL(custom_request_methods) : "none registered");
510 0 : php_info_print_table_row(2, "Allowed", strlen(HTTP_G->request.methods.allowed) ? HTTP_G->request.methods.allowed : "(ANY)");
511 :
512 0 : phpstr_free(&known_request_methods);
513 0 : phpstr_free(&custom_request_methods);
514 : }
515 0 : php_info_print_table_end();
516 :
517 0 : DISPLAY_INI_ENTRIES();
518 0 : }
519 : /* }}} */
520 :
521 : /*
522 : * Local variables:
523 : * tab-width: 4
524 : * c-basic-offset: 4
525 : * End:
526 : * vim600: noet sw=4 ts=4 fdm=marker
527 : * vim<600: noet sw=4 ts=4
528 : */
529 :
|