X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-http;a=blobdiff_plain;f=http.c;h=a2ffaf9fa40f64554719467a61711dc0d797d902;hp=6695ff9dedb324bad724789f4743cacc40c5387b;hb=ad5f896b03adaa073134a00108a9cdf00720673a;hpb=09c63e9aa5d552e91db75dcf5bc64ba33923348f diff --git a/http.c b/http.c index 6695ff9..a2ffaf9 100644 --- a/http.c +++ b/http.c @@ -6,66 +6,47 @@ | modification, are permitted provided that the conditions mentioned | | in the accompanying LICENSE file are met. | +--------------------------------------------------------------------+ - | Copyright (c) 2004-2005, Michael Wallner | + | Copyright (c) 2004-2010, Michael Wallner | +--------------------------------------------------------------------+ */ /* $Id$ */ +#define HTTP_WANT_SAPI +#define HTTP_WANT_CURL +#define HTTP_WANT_EVENT +#define HTTP_WANT_ZLIB +#define HTTP_WANT_MAGIC +#include "php_http.h" -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif -#include "php.h" - -#include "zend_extensions.h" - -#include "SAPI.h" #include "php_ini.h" #include "ext/standard/info.h" +#include "zend_extensions.h" -#include "php_http.h" -#include "php_http_std_defs.h" #include "php_http_api.h" -#include "php_http_send_api.h" #include "php_http_cache_api.h" -#include "php_http_headers_api.h" +#include "php_http_cookie_api.h" +#include "php_http_encoding_api.h" +#include "php_http_filter_api.h" +#include "php_http_message_api.h" +#include "php_http_persistent_handle_api.h" +#include "php_http_request_api.h" +#include "php_http_request_datashare_api.h" #include "php_http_request_method_api.h" -#ifdef HTTP_HAVE_CURL -# include "php_http_request_api.h" -#endif - -#ifdef ZEND_ENGINE_2 -# include "php_http_filter_api.h" -# include "php_http_util_object.h" -# include "php_http_message_object.h" -# ifndef WONKY -# include "php_http_response_object.h" -# endif -# ifdef HTTP_HAVE_CURL -# include "php_http_request_object.h" -# include "php_http_requestpool_object.h" -# endif -# include "php_http_exception_object.h" -#endif - -#include "missing.h" -#include "phpstr/phpstr.h" - -#ifdef HTTP_HAVE_CURL -# ifdef PHP_WIN32 -# include -# endif -# include -#endif -#ifdef HTTP_HAVE_MHASH -# include -#endif -#ifdef HTTP_HAVE_ZLIB -# include -#endif - -#include +#include "php_http_request_pool_api.h" +#include "php_http_send_api.h" +#include "php_http_url_api.h" + +#include "php_http_deflatestream_object.h" +#include "php_http_exception_object.h" +#include "php_http_inflatestream_object.h" +#include "php_http_message_object.h" +#include "php_http_querystring_object.h" +#include "php_http_request_object.h" +#include "php_http_requestdatashare_object.h" +#include "php_http_requestpool_object.h" +#include "php_http_response_object.h" +#include "php_http_util_object.h" ZEND_DECLARE_MODULE_GLOBALS(http); HTTP_DECLARE_ARG_PASS_INFO(); @@ -76,12 +57,15 @@ ZEND_GET_MODULE(http) /* {{{ http_functions[] */ zend_function_entry http_functions[] = { - PHP_FE(http_test, NULL) PHP_FE(http_date, NULL) - PHP_FE(http_build_uri, NULL) - PHP_FALIAS(http_absolute_uri, http_build_uri, NULL) + PHP_FE(http_build_url, http_arg_pass_ref_4) + PHP_FE(http_build_str, NULL) +#ifndef ZEND_ENGINE_2 + PHP_FALIAS(http_build_query, http_build_str, NULL) +#endif PHP_FE(http_negotiate_language, http_arg_pass_ref_2) PHP_FE(http_negotiate_charset, http_arg_pass_ref_2) + PHP_FE(http_negotiate_content_type, http_arg_pass_ref_2) PHP_FE(http_redirect, NULL) PHP_FE(http_throttle, NULL) PHP_FE(http_send_status, NULL) @@ -98,32 +82,37 @@ zend_function_entry http_functions[] = { PHP_FE(http_chunked_decode, NULL) PHP_FE(http_parse_message, NULL) PHP_FE(http_parse_headers, NULL) + PHP_FE(http_parse_cookie, NULL) + PHP_FE(http_build_cookie, NULL) + PHP_FE(http_parse_params, NULL) PHP_FE(http_get_request_headers, NULL) PHP_FE(http_get_request_body, NULL) + PHP_FE(http_get_request_body_stream, NULL) PHP_FE(http_match_request_header, NULL) + PHP_FE(http_persistent_handles_count, NULL) + PHP_FE(http_persistent_handles_clean, NULL) + PHP_FE(http_persistent_handles_ident, NULL) #ifdef HTTP_HAVE_CURL PHP_FE(http_get, http_arg_pass_ref_3) PHP_FE(http_head, http_arg_pass_ref_3) PHP_FE(http_post_data, http_arg_pass_ref_4) PHP_FE(http_post_fields, http_arg_pass_ref_5) + PHP_FE(http_put_data, http_arg_pass_ref_4) PHP_FE(http_put_file, http_arg_pass_ref_4) PHP_FE(http_put_stream, http_arg_pass_ref_4) + PHP_FE(http_request, http_arg_pass_ref_5) + PHP_FE(http_request_body_encode, NULL) #endif PHP_FE(http_request_method_register, NULL) PHP_FE(http_request_method_unregister, NULL) PHP_FE(http_request_method_exists, NULL) PHP_FE(http_request_method_name, NULL) -#ifndef ZEND_ENGINE_2 - PHP_FE(http_build_query, NULL) -#endif PHP_FE(ob_etaghandler, NULL) #ifdef HTTP_HAVE_ZLIB - PHP_FE(http_gzencode, NULL) - PHP_FE(http_gzdecode, NULL) PHP_FE(http_deflate, NULL) PHP_FE(http_inflate, NULL) - PHP_FE(http_compress, NULL) - PHP_FE(http_uncompress, NULL) + PHP_FE(ob_deflatehandler, NULL) + PHP_FE(ob_inflatehandler, NULL) #endif PHP_FE(http_support, NULL) @@ -131,12 +120,30 @@ zend_function_entry http_functions[] = { }; /* }}} */ +PHP_MINIT_FUNCTION(http); +PHP_MSHUTDOWN_FUNCTION(http); +PHP_RINIT_FUNCTION(http); +PHP_RSHUTDOWN_FUNCTION(http); +PHP_MINFO_FUNCTION(http); + /* {{{ http_module_dep */ #if ZEND_EXTENSION_API_NO >= 220050617 -static zend_module_dep http_module_dep[] = { -# ifdef HAVE_SPL +static zend_module_dep http_module_deps[] = { +# ifdef HTTP_HAVE_SPL ZEND_MOD_REQUIRED("spl") # endif +# ifdef HTTP_HAVE_HASH + ZEND_MOD_REQUIRED("hash") +# endif +# ifdef HTTP_HAVE_SESSION + ZEND_MOD_REQUIRED("session") +# endif +# ifdef HTTP_HAVE_ICONV + ZEND_MOD_REQUIRED("iconv") +# endif +# ifdef HTTP_HAVE_EVENT + ZEND_MOD_CONFLICTS("event") +#endif {NULL, NULL, NULL, 0} }; #endif @@ -146,7 +153,7 @@ static zend_module_dep http_module_dep[] = { zend_module_entry http_module_entry = { #if ZEND_EXTENSION_API_NO >= 220050617 STANDARD_MODULE_HEADER_EX, NULL, - http_module_dep, + http_module_deps, #else STANDARD_MODULE_HEADER, #endif @@ -157,7 +164,7 @@ zend_module_entry http_module_entry = { PHP_RINIT(http), PHP_RSHUTDOWN(http), PHP_MINFO(http), - HTTP_PEXT_VERSION, + PHP_HTTP_VERSION, STANDARD_MODULE_PROPERTIES }; /* }}} */ @@ -170,40 +177,53 @@ static void http_globals_init_once(zend_http_globals *G) memset(G, 0, sizeof(zend_http_globals)); } -static inline void http_globals_init(zend_http_globals *G) +#define http_globals_init(g) _http_globals_init((g) TSRMLS_CC) +static inline void _http_globals_init(zend_http_globals *G TSRMLS_DC) { - G->send.buffer_size = HTTP_SENDBUF_SIZE; - zend_hash_init(&G->request.methods.custom, 0, NULL, ZVAL_PTR_DTOR, 0); -#ifdef HTTP_HAVE_CURL - zend_llist_init(&G->request.copies.strings, sizeof(char *), http_request_data_free_string, 0); - zend_llist_init(&G->request.copies.slists, sizeof(struct curl_slist *), http_request_data_free_slist, 0); - zend_llist_init(&G->request.copies.contexts, sizeof(http_request_callback_ctx *), http_request_data_free_context, 0); - zend_llist_init(&G->request.copies.convs, sizeof(http_request_conv *), http_request_data_free_conv, 0); +#ifdef HTTP_HAVE_SAPI_RTIME + G->request.time = sapi_get_request_time(TSRMLS_C); +#else + G->request.time = time(NULL); #endif + G->send.buffer_size = 0; + G->read_post_data = 0; } -static inline void http_globals_free(zend_http_globals *G) +#define http_globals_free(g) _http_globals_free((g) TSRMLS_CC) +static inline void _http_globals_free(zend_http_globals *G TSRMLS_DC) { + if (G->request.headers) { + zend_hash_destroy(G->request.headers); + FREE_HASHTABLE(G->request.headers); + G->request.headers = NULL; + } STR_SET(G->send.content_type, NULL); STR_SET(G->send.unquoted_etag, NULL); - zend_hash_destroy(&G->request.methods.custom); -#ifdef HTTP_HAVE_CURL - zend_llist_clean(&G->request.copies.strings); - zend_llist_clean(&G->request.copies.slists); - zend_llist_clean(&G->request.copies.contexts); - zend_llist_clean(&G->request.copies.convs); -#endif + if (G->server_var) { + zval_ptr_dtor(&G->server_var); + G->server_var = NULL; + } +} + +#if defined(ZTS) && defined(PHP_DEBUG) +#if ZTS && PHP_DEBUG +zend_http_globals *http_globals(void) +{ + TSRMLS_FETCH(); + return HTTP_G; } +#endif +#endif /* }}} */ -/* {{{ static inline void http_check_allowed_methods(char *, int) */ -#define http_check_allowed_methods(m, l) _http_check_allowed_methods((m), (l) TSRMLS_CC) -static inline void _http_check_allowed_methods(char *methods, int length TSRMLS_DC) +/* {{{ static inline void http_check_allowed_methods(char *) */ +#define http_check_allowed_methods(m) _http_check_allowed_methods((m) TSRMLS_CC) +static inline void _http_check_allowed_methods(const char *methods TSRMLS_DC) { - if (length && SG(request_info).request_method) { + if (*methods && SG(request_info).request_method) { if (SUCCESS != http_check_method_ex(SG(request_info).request_method, methods)) { - char *header = emalloc(length + sizeof("Allow: ")); - sprintf(header, "Allow: %s", methods); + char *header; + spprintf(&header, 0, "Allow: %s", methods); http_exit(405, header); } } @@ -213,54 +233,15 @@ static inline void _http_check_allowed_methods(char *methods, int length TSRMLS_ /* {{{ PHP_INI */ PHP_INI_MH(http_update_allowed_methods) { - http_check_allowed_methods(new_value, new_value_length); + if (*new_value) { + http_check_allowed_methods(new_value); + } return OnUpdateString(entry, new_value, new_value_length, mh_arg1, mh_arg2, mh_arg3, stage TSRMLS_CC); } - -PHP_INI_DISP(http_etag_mode_displayer) +PHP_INI_MH(http_update_persistent_handle_ident) { - long value; - - if (type == ZEND_INI_DISPLAY_ORIG && ini_entry->modified) { - value = (ini_entry->orig_value) ? atoi(ini_entry->orig_value) : HTTP_ETAG_MD5; - } else if (ini_entry->value) { - value = (ini_entry->value[0]) ? atoi(ini_entry->value) : HTTP_ETAG_MD5; - } else { - value = HTTP_ETAG_MD5; - } - - switch (value) - { - case HTTP_ETAG_CRC32: - ZEND_WRITE("HTTP_ETAG_CRC32", lenof("HTTP_ETAG_CRC32")); - break; - - case HTTP_ETAG_SHA1: - ZEND_WRITE("HTTP_ETAG_SHA1", lenof("HTTP_ETAG_SHA1")); - break; - - case HTTP_ETAG_MD5: -#ifndef HTTP_HAVE_MHASH - default: -#endif - ZEND_WRITE("HTTP_ETAG_MD5", lenof("HTTP_ETAG_MD5")); - break; - -#ifdef HTTP_HAVE_MHASH - default: - { - const char *hash_name = mhash_get_hash_name_static(value); - - if (!hash_name) { - ZEND_WRITE("HTTP_ETAG_MD5", lenof("HTTP_ETAG_MD5")); - } else { - ZEND_WRITE("HTTP_ETAG_MHASH_", lenof("HTTP_ETAG_MHASH_")); - ZEND_WRITE(hash_name, strlen(hash_name)); - } - } - break; -#endif - } + HTTP_G->persistent.handles.ident.h = zend_hash_func(new_value, HTTP_G->persistent.handles.ident.l = new_value_length+1); + return OnUpdateString(entry, new_value, new_value_length, mh_arg1, mh_arg2, mh_arg3, stage TSRMLS_CC); } #ifndef ZEND_ENGINE_2 @@ -268,12 +249,29 @@ PHP_INI_DISP(http_etag_mode_displayer) #endif PHP_INI_BEGIN() - HTTP_PHP_INI_ENTRY("http.allowed_methods", "", PHP_INI_ALL, http_update_allowed_methods, request.methods.allowed) - HTTP_PHP_INI_ENTRY("http.cache_log", "", PHP_INI_ALL, OnUpdateString, log.cache) - HTTP_PHP_INI_ENTRY("http.redirect_log", "", PHP_INI_ALL, OnUpdateString, log.redirect) - HTTP_PHP_INI_ENTRY("http.allowed_methods_log", "", PHP_INI_ALL, OnUpdateString, log.allowed_methods) - HTTP_PHP_INI_ENTRY("http.composite_log", "", PHP_INI_ALL, OnUpdateString, log.composite) - HTTP_PHP_INI_ENTRY_EX("http.etag_mode", "-2", PHP_INI_ALL, OnUpdateLong, http_etag_mode_displayer, etag.mode) + HTTP_PHP_INI_ENTRY("http.etag.mode", "MD5", PHP_INI_ALL, OnUpdateString, etag.mode) + HTTP_PHP_INI_ENTRY("http.log.cache", "", PHP_INI_ALL, OnUpdateString, log.cache) + HTTP_PHP_INI_ENTRY("http.log.redirect", "", PHP_INI_ALL, OnUpdateString, log.redirect) + HTTP_PHP_INI_ENTRY("http.log.not_found", "", PHP_INI_ALL, OnUpdateString, log.not_found) + HTTP_PHP_INI_ENTRY("http.log.allowed_methods", "", PHP_INI_ALL, OnUpdateString, log.allowed_methods) + HTTP_PHP_INI_ENTRY("http.log.composite", "", PHP_INI_ALL, OnUpdateString, log.composite) + HTTP_PHP_INI_ENTRY("http.request.methods.allowed", "", PHP_INI_ALL, http_update_allowed_methods, request.methods.allowed) + HTTP_PHP_INI_ENTRY("http.request.methods.custom", "", PHP_INI_PERDIR|PHP_INI_SYSTEM, OnUpdateString, request.methods.custom) +#if defined(ZEND_ENGINE_2) && defined(HTTP_HAVE_CURL) + HTTP_PHP_INI_ENTRY("http.request.datashare.cookie", "0", PHP_INI_SYSTEM, OnUpdateBool, request.datashare.cookie) + HTTP_PHP_INI_ENTRY("http.request.datashare.dns", "1", PHP_INI_SYSTEM, OnUpdateBool, request.datashare.dns) + HTTP_PHP_INI_ENTRY("http.request.datashare.ssl", "0", PHP_INI_SYSTEM, OnUpdateBool, request.datashare.ssl) + HTTP_PHP_INI_ENTRY("http.request.datashare.connect", "0", PHP_INI_SYSTEM, OnUpdateBool, request.datashare.connect) +#endif +#ifdef HTTP_HAVE_ZLIB + HTTP_PHP_INI_ENTRY("http.send.inflate.start_auto", "0", PHP_INI_PERDIR|PHP_INI_SYSTEM, OnUpdateBool, send.inflate.start_auto) + HTTP_PHP_INI_ENTRY("http.send.inflate.start_flags", "0", PHP_INI_ALL, OnUpdateLong, send.inflate.start_flags) + HTTP_PHP_INI_ENTRY("http.send.deflate.start_auto", "0", PHP_INI_PERDIR|PHP_INI_SYSTEM, OnUpdateBool, send.deflate.start_auto) + HTTP_PHP_INI_ENTRY("http.send.deflate.start_flags", "0", PHP_INI_ALL, OnUpdateLong, send.deflate.start_flags) +#endif + HTTP_PHP_INI_ENTRY("http.persistent.handles.limit", "-1", PHP_INI_SYSTEM, OnUpdateLong, persistent.handles.limit) + HTTP_PHP_INI_ENTRY("http.persistent.handles.ident", "GLOBAL", PHP_INI_ALL, http_update_persistent_handle_ident, persistent.handles.ident.s) + HTTP_PHP_INI_ENTRY("http.send.not_found_404", "1", PHP_INI_ALL, OnUpdateBool, send.not_found_404) #ifdef ZEND_ENGINE_2 HTTP_PHP_INI_ENTRY("http.only_exceptions", "0", PHP_INI_ALL, OnUpdateBool, only_exceptions) #endif @@ -285,37 +283,50 @@ PHP_INI_END() PHP_MINIT_FUNCTION(http) { http_module_number = module_number; - - ZEND_INIT_MODULE_GLOBALS(http, http_globals_init_once, NULL) - + ZEND_INIT_MODULE_GLOBALS(http, http_globals_init_once, NULL); REGISTER_INI_ENTRIES(); - if ( (SUCCESS != PHP_MINIT_CALL(http_support)) || - (SUCCESS != PHP_MINIT_CALL(http_headers)) || - (SUCCESS != PHP_MINIT_CALL(http_cache)) || + if (0 + || SUCCESS != PHP_MINIT_CALL(http_persistent_handle) /* first */ + || SUCCESS != PHP_MINIT_CALL(http_cookie) +#ifdef HTTP_HAVE_ZLIB + || SUCCESS != PHP_MINIT_CALL(http_encoding) +#endif #ifdef HTTP_HAVE_CURL - (SUCCESS != PHP_MINIT_CALL(http_request)) || -#endif /* HTTP_HAVE_CURL */ - (SUCCESS != PHP_MINIT_CALL(http_request_method))) { - return FAILURE; - } - + || SUCCESS != PHP_MINIT_CALL(http_request) +# ifdef ZEND_ENGINE_2 +# endif +#endif + || SUCCESS != PHP_MINIT_CALL(http_request_method) + || SUCCESS != PHP_MINIT_CALL(http_send) + || SUCCESS != PHP_MINIT_CALL(http_support) + || SUCCESS != PHP_MINIT_CALL(http_url) + #ifdef ZEND_ENGINE_2 - if ( (SUCCESS != PHP_MINIT_CALL(http_filter)) || - (SUCCESS != PHP_MINIT_CALL(http_util_object)) || - (SUCCESS != PHP_MINIT_CALL(http_message_object)) || -# ifndef WONKY - (SUCCESS != PHP_MINIT_CALL(http_response_object)) || -# endif /* WONKY */ + || SUCCESS != PHP_MINIT_CALL(http_filter) + || SUCCESS != PHP_MINIT_CALL(http_exception_object) +# ifdef HTTP_HAVE_ZLIB + || SUCCESS != PHP_MINIT_CALL(http_deflatestream_object) + || SUCCESS != PHP_MINIT_CALL(http_inflatestream_object) +# endif + || SUCCESS != PHP_MINIT_CALL(http_message_object) + || SUCCESS != PHP_MINIT_CALL(http_querystring_object) # ifdef HTTP_HAVE_CURL - (SUCCESS != PHP_MINIT_CALL(http_request_object)) || - (SUCCESS != PHP_MINIT_CALL(http_requestpool_object))|| -# endif /* HTTP_HAVE_CURL */ - (SUCCESS != PHP_MINIT_CALL(http_exception_object))) { + || SUCCESS != PHP_MINIT_CALL(http_request_datashare) + || SUCCESS != PHP_MINIT_CALL(http_request_pool) + || SUCCESS != PHP_MINIT_CALL(http_request_object) + || SUCCESS != PHP_MINIT_CALL(http_requestdatashare_object) + || SUCCESS != PHP_MINIT_CALL(http_requestpool_object) +# endif +# ifndef WONKY + || SUCCESS != PHP_MINIT_CALL(http_response_object) +# endif + || SUCCESS != PHP_MINIT_CALL(http_util_object) +#endif + ) { return FAILURE; } -#endif /* ZEND_ENGINE_2 */ - + return SUCCESS; } /* }}} */ @@ -324,9 +335,20 @@ PHP_MINIT_FUNCTION(http) PHP_MSHUTDOWN_FUNCTION(http) { UNREGISTER_INI_ENTRIES(); + + if (0 #ifdef HTTP_HAVE_CURL - return PHP_MSHUTDOWN_CALL(http_request); + || SUCCESS != PHP_MSHUTDOWN_CALL(http_request) +# ifdef ZEND_ENGINE_2 + || SUCCESS != PHP_MSHUTDOWN_CALL(http_request_datashare) +# endif #endif + || SUCCESS != PHP_MSHUTDOWN_CALL(http_message_object) + || SUCCESS != PHP_MSHUTDOWN_CALL(http_persistent_handle) /* last */ + ) { + return FAILURE; + } + return SUCCESS; } /* }}} */ @@ -334,12 +356,29 @@ PHP_MSHUTDOWN_FUNCTION(http) /* {{{ PHP_RINIT_FUNCTION */ PHP_RINIT_FUNCTION(http) { - if (HTTP_G(request).methods.allowed) { - http_check_allowed_methods(HTTP_G(request).methods.allowed, - strlen(HTTP_G(request).methods.allowed)); + http_globals_init(HTTP_G); + + if (HTTP_G->request.methods.allowed && *HTTP_G->request.methods.allowed) { + http_check_allowed_methods(HTTP_G->request.methods.allowed); } - - http_globals_init(HTTP_GLOBALS); + + if (0 +#ifdef HTTP_HAVE_ZLIB + || SUCCESS != PHP_RINIT_CALL(http_encoding) +#endif +#ifdef HTTP_HAVE_CURL +# ifdef ZEND_ENGINE_2 +# ifdef HTTP_HAVE_EVENT + || SUCCESS != PHP_RINIT_CALL(http_request_pool) +# endif + || SUCCESS != PHP_RINIT_CALL(http_request_datashare) +# endif +#endif + || SUCCESS != PHP_RINIT_CALL(http_request_method) + ) { + return FAILURE; + } + return SUCCESS; } /* }}} */ @@ -349,11 +388,21 @@ PHP_RSHUTDOWN_FUNCTION(http) { STATUS status = SUCCESS; -#if defined(ZEND_ENGINE_2) && defined(HTTP_HAVE_CURL) - status = PHP_RSHUTDOWN_CALL(http_request_method); + if (0 +#ifdef HTTP_HAVE_ZLIB + || SUCCESS != PHP_RSHUTDOWN_CALL(http_encoding) #endif +#ifdef HTTP_HAVE_CURL +# ifdef ZEND_ENGINE_2 + || SUCCESS != PHP_RSHUTDOWN_CALL(http_request_datashare) +# endif +#endif + || SUCCESS != PHP_RSHUTDOWN_CALL(http_request_method) + ) { + status = FAILURE; + } - http_globals_free(HTTP_GLOBALS); + http_globals_free(HTTP_G); return status; } /* }}} */ @@ -363,39 +412,8 @@ PHP_MINFO_FUNCTION(http) { php_info_print_table_start(); { - php_info_print_table_row(2, "Extended HTTP support", "enabled"); - php_info_print_table_row(2, "Extension Version", HTTP_PEXT_VERSION); -#ifdef HTTP_HAVE_CURL - php_info_print_table_row(2, "cURL HTTP Requests", curl_version()); -#else - php_info_print_table_row(2, "cURL HTTP Requests", "disabled"); -#endif -#ifdef HTTP_HAVE_ZLIB - { - char my_zlib_version[64] = {0}; - - strlcat(my_zlib_version, "zlib/", 63); - strlcat(my_zlib_version, zlibVersion(), 63); - php_info_print_table_row(2, "zlib GZIP Encodings", my_zlib_version); - } -#else - php_info_print_table_row(2, "zlib GZIP Encodings", "disabled"); -#endif -#ifdef HTTP_HAVE_MHASH - { - char mhash_info[32]; - - snprintf(mhash_info, 32, "libmhash/%d", MHASH_API_VERSION); - php_info_print_table_row(2, "mhash ETag Generator", mhash_info); - } -#else - php_info_print_table_row(2, "mhash ETag Generator", "disabled"); -#endif -#if defined(HTTP_HAVE_MAGIC) && !defined(WONKY) - php_info_print_table_row(2, "magic MIME Guessing", "libmagic/unknown"); -#else - php_info_print_table_row(2, "magic MIME Guessing", "disabled"); -#endif + php_info_print_table_header(2, "HTTP Support", "enabled"); + php_info_print_table_row(2, "Extension Version", PHP_HTTP_VERSION); php_info_print_table_row(2, "Registered Classes", #ifndef ZEND_ENGINE_2 "none" @@ -405,74 +423,113 @@ PHP_MINFO_FUNCTION(http) # ifdef HTTP_HAVE_CURL "HttpRequest, " "HttpRequestPool, " + "HttpRequestDataShare, " +# endif +# ifdef HTTP_HAVE_ZLIB + "HttpDeflateStream, " + "HttpInflateStream, " # endif # ifndef WONKY - "HttpResponse" + "HttpResponse, " # endif + "HttpQueryString" +#endif + ); + php_info_print_table_row(2, "Output Handlers", "ob_deflatehandler, ob_inflatehandler, ob_etaghandler"); + php_info_print_table_row(2, "Stream Filters", +#ifndef ZEND_ENGINE_2 + "none" +#else + "http.chunked_decode, http.chunked_encode, http.deflate, http.inflate" #endif ); } php_info_print_table_end(); php_info_print_table_start(); - php_info_print_table_colspan_header(2, "Supported ETag Hash Algorithms"); + php_info_print_table_header(3, "Used Library", "Compiled", "Linked"); + { +#ifdef HTTP_HAVE_CURL + curl_version_info_data *cv = curl_version_info(CURLVERSION_NOW); + php_info_print_table_row(3, "libcurl", LIBCURL_VERSION, cv->version); +#else + php_info_print_table_row(2, "libcurl", "disabled", "disabled"); +#endif +#ifdef HTTP_HAVE_EVENT + php_info_print_table_row(3, "libevent", HTTP_EVENT_VERSION, event_get_version()); +#else + php_info_print_table_row(3, "libevent", "disabled", "disabled"); +#endif +#ifdef HTTP_HAVE_ZLIB + php_info_print_table_row(3, "libz", ZLIB_VERSION, zlibVersion()); +#else + php_info_print_table_row(3, "libz", "disabled", "disabled"); +#endif +#if defined(HTTP_HAVE_MAGIC) + php_info_print_table_row(3, "libmagic", "unknown", "unknown"); +#else + php_info_print_table_row(3, "libmagic", "disabled", "disabled"); +#endif + } + 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"); { - - php_info_print_table_row(2, "PHP", "CRC32, MD5, SHA1"); -#ifdef HTTP_HAVE_MHASH - { - phpstr *algos = phpstr_new(); - int i, c = mhash_count(); - - for (i = 0; i <= c; ++i) { - const char *hash = mhash_get_hash_name_static(i); - - if (hash) { - phpstr_appendf(algos, "%s, ", hash); + HashTable *ht; + HashPosition pos1, pos2; + HashKey provider = initHashKey(0), ident = initHashKey(0); + zval **val, **sub, **zused, **zfree; + + if ((ht = http_persistent_handle_statall()) && zend_hash_num_elements(ht)) { + FOREACH_HASH_KEYVAL(pos1, ht, provider, val) { + if (zend_hash_num_elements(Z_ARRVAL_PP(val))) { + FOREACH_KEYVAL(pos2, *val, ident, sub) { + if ( SUCCESS == zend_hash_find(Z_ARRVAL_PP(sub), ZEND_STRS("used"), (void *) &zused) && + SUCCESS == zend_hash_find(Z_ARRVAL_PP(sub), ZEND_STRS("free"), (void *) &zfree)) { + zval *used = http_zsep(IS_STRING, *zused); + zval *free = http_zsep(IS_STRING, *zfree); + php_info_print_table_row(4, provider.str, ident.str, Z_STRVAL_P(used), Z_STRVAL_P(free)); + zval_ptr_dtor(&used); + zval_ptr_dtor(&free); + } else { + php_info_print_table_row(4, provider.str, ident.str, "0", "0"); + } + } + } else { + php_info_print_table_row(4, provider.str, "N/A", "0", "0"); } } - phpstr_fix(algos); - php_info_print_table_row(2, "MHASH", PHPSTR_VAL(algos)); - phpstr_free(&algos); + } else { + php_info_print_table_row(4, "N/A", "N/A", "0", "0"); + } + if (ht) { + zend_hash_destroy(ht); + FREE_HASHTABLE(ht); } -#else - php_info_print_table_row(2, "MHASH", "not available"); -#endif } php_info_print_table_end(); - + php_info_print_table_start(); php_info_print_table_colspan_header(2, "Request Methods"); { - unsigned i; HashPosition pos; - zval **custom_method; - phpstr *known_request_methods = phpstr_new(); - phpstr *custom_request_methods = phpstr_new(); - - for (i = HTTP_NO_REQUEST_METHOD+1; i < HTTP_MAX_REQUEST_METHOD; ++i) { - phpstr_appendl(known_request_methods, http_request_method_name(i)); - phpstr_appends(known_request_methods, ", "); - } - FOREACH_HASH_VAL(pos, &HTTP_G(request).methods.custom, custom_method) { - phpstr_append(custom_request_methods, Z_STRVAL_PP(custom_method), Z_STRLEN_PP(custom_method)); - phpstr_appends(custom_request_methods, ", "); - } - - phpstr_append(known_request_methods, PHPSTR_VAL(custom_request_methods), PHPSTR_LEN(custom_request_methods)); - phpstr_fix(known_request_methods); - phpstr_fix(custom_request_methods); - - php_info_print_table_row(2, "Known", PHPSTR_VAL(known_request_methods)); - php_info_print_table_row(2, "Custom", - PHPSTR_LEN(custom_request_methods) ? PHPSTR_VAL(custom_request_methods) : "none registered"); - php_info_print_table_row(2, "Allowed", strlen(HTTP_G(request).methods.allowed) ? HTTP_G(request).methods.allowed : "(ANY)"); + phpstr *methods = phpstr_new(); + char **name; - phpstr_free(&known_request_methods); - phpstr_free(&custom_request_methods); + FOREACH_HASH_VAL(pos, &HTTP_G->request.methods.registered, name) { + if (pos->h) { + phpstr_appendf(methods, "%s, ", *name); + } + } + phpstr_fix(methods); + php_info_print_table_row(2, "Registered", PHPSTR_VAL(methods)); + php_info_print_table_row(2, "Allowed", *HTTP_G->request.methods.allowed ? HTTP_G->request.methods.allowed : "(ANY)"); + phpstr_free(&methods); } php_info_print_table_end(); - + DISPLAY_INI_ENTRIES(); } /* }}} */