From 6d3b1f9cef7c8e63fc6ffa7305fd971bab6a58be Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Wed, 12 Dec 2012 11:42:52 +0000 Subject: [PATCH] display registered API --- php_http.c | 76 +++++++++++++++++++++++++++++++++++++++++++++++++----- php_http.h | 1 + 2 files changed, 70 insertions(+), 7 deletions(-) diff --git a/php_http.c b/php_http.c index 06ec915..86933ea 100644 --- a/php_http.c +++ b/php_http.c @@ -77,7 +77,29 @@ zend_module_entry http_module_entry = { int http_module_number; -#if PHP_DEBUG +static HashTable http_module_classes; +void php_http_register_class(zend_class_entry *(*get_ce)(void)) +{ + zend_hash_next_index_insert(&http_module_classes, &get_ce, sizeof(get_ce), NULL); +} +static void php_http_registered_classes(php_http_buffer_t *buf, unsigned flags) +{ + HashPosition pos; + zend_class_entry *(**get_ce)(void); + + FOREACH_HASH_VAL(pos, &http_module_classes, get_ce) { + zend_class_entry *ce = (*get_ce)(); + if ((flags && (ce->ce_flags & flags)) || (!flags && !(ce->ce_flags & 0x0fff))) { + if (buf->used) { + php_http_buffer_appends(buf, ", "); + } + php_http_buffer_append(buf, ce->name, ce->name_length); + } + } + php_http_buffer_fix(buf); +} + +#if PHP_DEBUG && !HAVE_GCOV void _dpf(int type, const char *data, size_t length) { static const char _sym[] = "><><><"; @@ -103,6 +125,7 @@ static void php_http_globals_init_once(zend_php_http_globals *G) memset(G, 0, sizeof(*G)); } +#if 0 static inline void php_http_globals_init(zend_php_http_globals *G TSRMLS_DC) { } @@ -110,16 +133,16 @@ static inline void php_http_globals_init(zend_php_http_globals *G TSRMLS_DC) static inline void php_http_globals_free(zend_php_http_globals *G TSRMLS_DC) { } +#endif -#if defined(ZTS) && defined(PHP_DEBUG) -#if ZTS && PHP_DEBUG +#if ZTS && PHP_DEBUG && !HAVE_GCOV zend_php_http_globals *php_http_globals(void) { TSRMLS_FETCH(); return PHP_HTTP_G; } #endif -#endif + PHP_INI_BEGIN() PHP_HTTP_INI_ENTRY("http.etag.mode", "crc32b", PHP_INI_ALL, OnUpdateString, env.etag_mode) PHP_HTTP_INI_ENTRY("http.persistent_handle.limit", "-1", PHP_INI_SYSTEM, OnUpdateLong, persistent_handle.limit) @@ -131,6 +154,8 @@ PHP_MINIT_FUNCTION(http) ZEND_INIT_MODULE_GLOBALS(php_http, php_http_globals_init_once, NULL); REGISTER_INI_ENTRIES(); + zend_hash_init(&http_module_classes, 0, NULL, NULL, 1); + if (0 || SUCCESS != PHP_MINIT_CALL(http_object) || SUCCESS != PHP_MINIT_CALL(http_exception) @@ -186,6 +211,8 @@ PHP_MSHUTDOWN_FUNCTION(http) return FAILURE; } + zend_hash_destroy(&http_module_classes); + return SUCCESS; } @@ -219,6 +246,11 @@ PHP_RSHUTDOWN_FUNCTION(http) PHP_MINFO_FUNCTION(http) { + unsigned i; + php_http_buffer_t buf; + + php_http_buffer_init(&buf); + php_info_print_table_start(); php_info_print_table_header(2, "HTTP Support", "enabled"); php_info_print_table_row(2, "Extension Version", PHP_HTTP_EXT_VERSION); @@ -251,17 +283,45 @@ PHP_MINFO_FUNCTION(http) #if PHP_HTTP_HAVE_SERF { int v[3]; - char sl_v[16] = {0}; serf_lib_version(&v[0], &v[1], &v[2]); - slprintf(sl_v, lenof(sl_v), "%d.%d.%d", v[0], v[1], v[2]); - php_info_print_table_row(3, "libserf", SERF_VERSION_STRING, sl_v); + php_http_buffer_appendf(&buf, "%d.%d.%d", v[0], v[1], v[2]); + php_http_buffer_fix(&buf); + php_info_print_table_row(3, "libserf", SERF_VERSION_STRING, buf.data); + php_http_buffer_reset(&buf); } #else php_info_print_table_row(3, "libserf", "disabled", "disabled"); #endif php_info_print_table_end(); + php_info_print_table_start(); + php_info_print_table_colspan_header(2, "Registered API"); + for (i = 0; http_functions[i].fname; ++i) { + if (buf.used) { + php_http_buffer_appends(&buf, ", "); + } + php_http_buffer_appendl(&buf, http_functions[i].fname); + } + php_http_buffer_fix(&buf); + php_info_print_table_row(2, "Functions", buf.data); + php_http_buffer_reset(&buf); + php_http_registered_classes(&buf, ZEND_ACC_INTERFACE); + php_info_print_table_row(2, "Interfaces", buf.data); + php_http_buffer_reset(&buf); + php_http_registered_classes(&buf, ZEND_ACC_EXPLICIT_ABSTRACT_CLASS); + php_info_print_table_row(2, "Abstract Classes", buf.data); + php_http_buffer_reset(&buf); + php_http_registered_classes(&buf, 0); + php_info_print_table_row(2, "Implemented Classes", buf.data); + php_http_buffer_reset(&buf); + php_http_registered_classes(&buf, ZEND_ACC_FINAL_CLASS); + php_info_print_table_row(2, "Final Classes", buf.data); + php_http_buffer_reset(&buf); + + php_info_print_table_row(2, "Stream Filters", "http.chunked_encode, http.chunked_decode, http.inflate, http.deflate"); + php_info_print_table_end(); + php_info_print_table_start(); php_info_print_table_colspan_header(4, "Persistent Handles"); php_info_print_table_header(4, "Provider", "Ident", "Used", "Free"); @@ -300,6 +360,8 @@ PHP_MINFO_FUNCTION(http) } php_info_print_table_end(); + php_http_buffer_dtor(&buf); + DISPLAY_INI_ENTRIES(); } diff --git a/php_http.h b/php_http.h index c69054d..dfd7ca5 100644 --- a/php_http.h +++ b/php_http.h @@ -19,6 +19,7 @@ zend_module_entry http_module_entry; #define phpext_http_ptr &http_module_entry int http_module_number; +void php_http_register_class(zend_class_entry *(*get_ce)(void)); #endif /* PHP_EXT_HTTP_H */ -- 2.30.2