LTP GCOV extension - code coverage report
Current view: directory - ext/http - http.c
Test: PHP Code Coverage
Date: 2007-04-10 Instrumented lines: 110
Code covered: 46.4 % Executed lines: 51
Legend: not executed executed

       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                 : 

Generated by: LTP GCOV extension version 1.5