Diff for /embedaddon/php/ext/soap/soap.c between versions 1.1.1.2 and 1.1.1.4

version 1.1.1.2, 2012/05/29 12:34:42 version 1.1.1.4, 2013/10/14 08:02:30
Line 2 Line 2
   +----------------------------------------------------------------------+    +----------------------------------------------------------------------+
   | PHP Version 5                                                        |    | PHP Version 5                                                        |
   +----------------------------------------------------------------------+    +----------------------------------------------------------------------+
  | Copyright (c) 1997-2012 The PHP Group                                |  | Copyright (c) 1997-2013 The PHP Group                                |
   +----------------------------------------------------------------------+    +----------------------------------------------------------------------+
   | This source file is subject to version 3.01 of the PHP license,      |    | This source file is subject to version 3.01 of the PHP license,      |
   | that is bundled with this package in the file LICENSE, and is        |    | that is bundled with this package in the file LICENSE, and is        |
Line 463  zend_module_entry soap_module_entry = { Line 463  zend_module_entry soap_module_entry = {
 ZEND_GET_MODULE(soap)  ZEND_GET_MODULE(soap)
 #endif  #endif
   
 ZEND_INI_MH(OnUpdateCacheEnabled)  
 {  
         if (OnUpdateBool(entry, new_value, new_value_length, mh_arg1, mh_arg2, mh_arg3, stage TSRMLS_CC) == FAILURE) {  
                 return FAILURE;  
         }  
         if (SOAP_GLOBAL(cache_enabled)) {  
                 SOAP_GLOBAL(cache) = SOAP_GLOBAL(cache_mode);  
         } else {  
                 SOAP_GLOBAL(cache) = 0;  
         }  
         return SUCCESS;  
 }  
   
 ZEND_INI_MH(OnUpdateCacheMode)  ZEND_INI_MH(OnUpdateCacheMode)
 {  {
         char *p;          char *p;
Line 489  ZEND_INI_MH(OnUpdateCacheMode) Line 476  ZEND_INI_MH(OnUpdateCacheMode)
   
         *p = (char)atoi(new_value);          *p = (char)atoi(new_value);
   
        if (SOAP_GLOBAL(cache_enabled)) {        return SUCCESS;
                SOAP_GLOBAL(cache) = SOAP_GLOBAL(cache_mode);}
        } else {
                SOAP_GLOBAL(cache) = 0;static PHP_INI_MH(OnUpdateCacheDir)
 {
         /* Only do the open_basedir check at runtime */
         if (stage == PHP_INI_STAGE_RUNTIME || stage == PHP_INI_STAGE_HTACCESS) {
                 char *p;
 
                 if (memchr(new_value, '\0', new_value_length) != NULL) {
                         return FAILURE;
                 }
 
                 /* we do not use zend_memrchr() since path can contain ; itself */
                 if ((p = strchr(new_value, ';'))) {
                         char *p2;
                         p++;
                         if ((p2 = strchr(p, ';'))) {
                                 p = p2 + 1;
                         }
                 } else {
                         p = new_value;
                 }
 
                 if (PG(open_basedir) && *p && php_check_open_basedir(p TSRMLS_CC)) {
                         return FAILURE;
                 }
         }          }
   
           OnUpdateString(entry, new_value, new_value_length, mh_arg1, mh_arg2, mh_arg3, stage TSRMLS_CC);
         return SUCCESS;          return SUCCESS;
 }  }
   
 PHP_INI_BEGIN()  PHP_INI_BEGIN()
STD_PHP_INI_ENTRY("soap.wsdl_cache_enabled",     "1", PHP_INI_ALL, OnUpdateCacheEnabled,STD_PHP_INI_ENTRY("soap.wsdl_cache_enabled",     "1", PHP_INI_ALL, OnUpdateBool,
                   cache_enabled, zend_soap_globals, soap_globals)                    cache_enabled, zend_soap_globals, soap_globals)
STD_PHP_INI_ENTRY("soap.wsdl_cache_dir",         "/tmp", PHP_INI_ALL, OnUpdateString,STD_PHP_INI_ENTRY("soap.wsdl_cache_dir",         "/tmp", PHP_INI_ALL, OnUpdateCacheDir,
                   cache_dir, zend_soap_globals, soap_globals)                    cache_dir, zend_soap_globals, soap_globals)
 STD_PHP_INI_ENTRY("soap.wsdl_cache_ttl",         "86400", PHP_INI_ALL, OnUpdateLong,  STD_PHP_INI_ENTRY("soap.wsdl_cache_ttl",         "86400", PHP_INI_ALL, OnUpdateLong,
                   cache_ttl, zend_soap_globals, soap_globals)                    cache_ttl, zend_soap_globals, soap_globals)
Line 1102  PHP_METHOD(SoapServer, SoapServer) Line 1114  PHP_METHOD(SoapServer, SoapServer)
         memset(service, 0, sizeof(soapService));          memset(service, 0, sizeof(soapService));
         service->send_errors = 1;          service->send_errors = 1;
   
        cache_wsdl = SOAP_GLOBAL(cache);        cache_wsdl = SOAP_GLOBAL(cache_enabled) ? SOAP_GLOBAL(cache_mode) : 0;
   
         if (options != NULL) {          if (options != NULL) {
                 HashTable *ht = Z_ARRVAL_P(options);                  HashTable *ht = Z_ARRVAL_P(options);
Line 1272  PHP_METHOD(SoapServer, setClass) Line 1284  PHP_METHOD(SoapServer, setClass)
                         }                          }
                 }                  }
         } else {          } else {
                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Tried to set a non existant class (%s)", classname);                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Tried to set a non existent class (%s)", classname);
                 return;                  return;
         }          }
   
Line 1403  PHP_METHOD(SoapServer, addFunction) Line 1415  PHP_METHOD(SoapServer, addFunction)
                                 zend_str_tolower_copy(key, Z_STRVAL_PP(tmp_function), key_len);                                  zend_str_tolower_copy(key, Z_STRVAL_PP(tmp_function), key_len);
   
                                 if (zend_hash_find(EG(function_table), key, key_len+1, (void**)&f) == FAILURE) {                                  if (zend_hash_find(EG(function_table), key, key_len+1, (void**)&f) == FAILURE) {
                                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Tried to add a non existant function '%s'", Z_STRVAL_PP(tmp_function));                                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Tried to add a non existent function '%s'", Z_STRVAL_PP(tmp_function));
                                         return;                                          return;
                                 }                                  }
   
Line 1425  PHP_METHOD(SoapServer, addFunction) Line 1437  PHP_METHOD(SoapServer, addFunction)
                 zend_str_tolower_copy(key, Z_STRVAL_P(function_name), key_len);                  zend_str_tolower_copy(key, Z_STRVAL_P(function_name), key_len);
   
                 if (zend_hash_find(EG(function_table), key, key_len+1, (void**)&f) == FAILURE) {                  if (zend_hash_find(EG(function_table), key, key_len+1, (void**)&f) == FAILURE) {
                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Tried to add a non existant function '%s'", Z_STRVAL_P(function_name));                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Tried to add a non existent function '%s'", Z_STRVAL_P(function_name));
                         return;                          return;
                 }                  }
                 if (service->soap_functions.ft == NULL) {                  if (service->soap_functions.ft == NULL) {
Line 1657  PHP_METHOD(SoapServer, handle) Line 1669  PHP_METHOD(SoapServer, handle)
                         }                          }
                 }                  }
 #endif  #endif
                /* If new session or something wierd happned */                /* If new session or something weird happned */
                 if (soap_obj == NULL) {                  if (soap_obj == NULL) {
                         zval *tmp_soap;                          zval *tmp_soap;
   
Line 2318  PHP_METHOD(SoapClient, SoapClient) Line 2330  PHP_METHOD(SoapClient, SoapClient)
                 php_error_docref(NULL TSRMLS_CC, E_ERROR, "$wsdl must be string or null");                  php_error_docref(NULL TSRMLS_CC, E_ERROR, "$wsdl must be string or null");
         }          }
   
        cache_wsdl = SOAP_GLOBAL(cache);        cache_wsdl = SOAP_GLOBAL(cache_enabled) ? SOAP_GLOBAL(cache_mode) : 0;
   
         if (options != NULL) {          if (options != NULL) {
                 HashTable *ht = Z_ARRVAL_P(options);                  HashTable *ht = Z_ARRVAL_P(options);
Line 3646  ignore_header: Line 3658  ignore_header:
         return function;          return function;
 }  }
   
static int serialize_response_call2(xmlNodePtr body, sdlFunctionPtr function, char *function_name, char *uri, zval *ret, int version, int main TSRMLS_DC)static void set_soap_header_attributes(xmlNodePtr h, HashTable *ht, int version)
 {  {
           zval **tmp;
   
           if (zend_hash_find(ht, "mustUnderstand", sizeof("mustUnderstand"), (void**)&tmp) == SUCCESS &&
               Z_TYPE_PP(tmp) == IS_BOOL && Z_LVAL_PP(tmp)) {
                   if (version == SOAP_1_1) {
                           xmlSetProp(h, BAD_CAST(SOAP_1_1_ENV_NS_PREFIX":mustUnderstand"), BAD_CAST("1"));
                   } else {
                           xmlSetProp(h, BAD_CAST(SOAP_1_2_ENV_NS_PREFIX":mustUnderstand"), BAD_CAST("true"));
                   }
           }
           if (zend_hash_find(ht, "actor", sizeof("actor"), (void**)&tmp) == SUCCESS) {
                   if (Z_TYPE_PP(tmp) == IS_STRING) {
                           if (version == SOAP_1_1) {
                                   xmlSetProp(h, BAD_CAST(SOAP_1_1_ENV_NS_PREFIX":actor"), BAD_CAST(Z_STRVAL_PP(tmp)));
                           } else {
                                   xmlSetProp(h, BAD_CAST(SOAP_1_2_ENV_NS_PREFIX":role"), BAD_CAST(Z_STRVAL_PP(tmp)));
                           }
                   } else if (Z_TYPE_PP(tmp) == IS_LONG) {
                           if (version == SOAP_1_1) {
                                   if (Z_LVAL_PP(tmp) == SOAP_ACTOR_NEXT) {
                                           xmlSetProp(h, BAD_CAST(SOAP_1_1_ENV_NS_PREFIX":actor"), BAD_CAST(SOAP_1_1_ACTOR_NEXT));
                                   }
                           } else {
                                   if (Z_LVAL_PP(tmp) == SOAP_ACTOR_NEXT) {
                                           xmlSetProp(h, BAD_CAST(SOAP_1_2_ENV_NS_PREFIX":role"), BAD_CAST(SOAP_1_2_ACTOR_NEXT));
                                   } else if (Z_LVAL_PP(tmp) == SOAP_ACTOR_NONE) {
                                           xmlSetProp(h, BAD_CAST(SOAP_1_2_ENV_NS_PREFIX":role"), BAD_CAST(SOAP_1_2_ACTOR_NONE));
                                   } else if (Z_LVAL_PP(tmp) == SOAP_ACTOR_UNLIMATERECEIVER) {
                                           xmlSetProp(h, BAD_CAST(SOAP_1_2_ENV_NS_PREFIX":role"), BAD_CAST(SOAP_1_2_ACTOR_UNLIMATERECEIVER));
                                   }
                           }
                   }
           }
   }
   
   static int serialize_response_call2(xmlNodePtr body, sdlFunctionPtr function, char *function_name, char *uri, zval *ret, int version, int main, xmlNodePtr *node TSRMLS_DC)
   {
         xmlNodePtr method = NULL, param;          xmlNodePtr method = NULL, param;
         sdlParamPtr parameter = NULL;          sdlParamPtr parameter = NULL;
         int param_count;          int param_count;
Line 3746  static int serialize_response_call2(xmlNodePtr body, s Line 3795  static int serialize_response_call2(xmlNodePtr body, s
         if (use == SOAP_ENCODED && version == SOAP_1_2 && method != NULL) {          if (use == SOAP_ENCODED && version == SOAP_1_2 && method != NULL) {
                 xmlSetNsProp(method, body->ns, BAD_CAST("encodingStyle"), BAD_CAST(SOAP_1_2_ENC_NAMESPACE));                  xmlSetNsProp(method, body->ns, BAD_CAST("encodingStyle"), BAD_CAST(SOAP_1_2_ENC_NAMESPACE));
         }          }
           if (node) {
                   *node = method;
           }
         return use;          return use;
 }  }
   
Line 3827  static xmlDocPtr serialize_response_call(sdlFunctionPt Line 3879  static xmlDocPtr serialize_response_call(sdlFunctionPt
                         }                          }
   
                         if (headers->function) {                          if (headers->function) {
                                if (serialize_response_call2(head, headers->function, Z_STRVAL(headers->function_name), uri, hdr_ret, version, 0 TSRMLS_CC) == SOAP_ENCODED) {                                if (serialize_response_call2(head, headers->function, Z_STRVAL(headers->function_name), uri, hdr_ret, version, 0, NULL TSRMLS_CC) == SOAP_ENCODED) {
                                         use = SOAP_ENCODED;                                          use = SOAP_ENCODED;
                                 }                                  }
                         } else {                          } else {
Line 3897  static xmlDocPtr serialize_response_call(sdlFunctionPt Line 3949  static xmlDocPtr serialize_response_call(sdlFunctionPt
   
                 if (version == SOAP_1_1) {                  if (version == SOAP_1_1) {
                         if (zend_hash_find(prop, "faultcode", sizeof("faultcode"), (void**)&tmp) == SUCCESS) {                          if (zend_hash_find(prop, "faultcode", sizeof("faultcode"), (void**)&tmp) == SUCCESS) {
                                int new_len;                                size_t new_len;
                                 xmlNodePtr node = xmlNewNode(NULL, BAD_CAST("faultcode"));                                  xmlNodePtr node = xmlNewNode(NULL, BAD_CAST("faultcode"));
                                 char *str = php_escape_html_entities((unsigned char*)Z_STRVAL_PP(tmp), Z_STRLEN_PP(tmp), &new_len, 0, 0, NULL TSRMLS_CC);                                  char *str = php_escape_html_entities((unsigned char*)Z_STRVAL_PP(tmp), Z_STRLEN_PP(tmp), &new_len, 0, 0, NULL TSRMLS_CC);
                                 xmlAddChild(param, node);                                  xmlAddChild(param, node);
Line 3907  static xmlDocPtr serialize_response_call(sdlFunctionPt Line 3959  static xmlDocPtr serialize_response_call(sdlFunctionPt
                                         xmlNodeSetContent(node, code);                                          xmlNodeSetContent(node, code);
                                         xmlFree(code);                                          xmlFree(code);
                                 } else {                                          } else {        
                                        xmlNodeSetContentLen(node, BAD_CAST(str), new_len);                                        xmlNodeSetContentLen(node, BAD_CAST(str), (int)new_len);
                                 }                                  }
                                 efree(str);                                  efree(str);
                         }                          }
Line 3922  static xmlDocPtr serialize_response_call(sdlFunctionPt Line 3974  static xmlDocPtr serialize_response_call(sdlFunctionPt
                         detail_name = "detail";                          detail_name = "detail";
                 } else {                  } else {
                         if (zend_hash_find(prop, "faultcode", sizeof("faultcode"), (void**)&tmp) == SUCCESS) {                          if (zend_hash_find(prop, "faultcode", sizeof("faultcode"), (void**)&tmp) == SUCCESS) {
                                int new_len;                                size_t new_len;
                                 xmlNodePtr node = xmlNewChild(param, ns, BAD_CAST("Code"), NULL);                                  xmlNodePtr node = xmlNewChild(param, ns, BAD_CAST("Code"), NULL);
                                 char *str = php_escape_html_entities((unsigned char*)Z_STRVAL_PP(tmp), Z_STRLEN_PP(tmp), &new_len, 0, 0, NULL TSRMLS_CC);                                  char *str = php_escape_html_entities((unsigned char*)Z_STRVAL_PP(tmp), Z_STRLEN_PP(tmp), &new_len, 0, 0, NULL TSRMLS_CC);
                                 node = xmlNewChild(node, ns, BAD_CAST("Value"), NULL);                                  node = xmlNewChild(node, ns, BAD_CAST("Value"), NULL);
Line 3932  static xmlDocPtr serialize_response_call(sdlFunctionPt Line 3984  static xmlDocPtr serialize_response_call(sdlFunctionPt
                                         xmlNodeSetContent(node, code);                                          xmlNodeSetContent(node, code);
                                         xmlFree(code);                                          xmlFree(code);
                                 } else {                                          } else {        
                                        xmlNodeSetContentLen(node, BAD_CAST(str), new_len);                                        xmlNodeSetContentLen(node, BAD_CAST(str), (int)new_len);
                                 }                                  }
                                 efree(str);                                  efree(str);
                         }                          }
Line 4013  static xmlDocPtr serialize_response_call(sdlFunctionPt Line 4065  static xmlDocPtr serialize_response_call(sdlFunctionPt
                                         zval *hdr_ret = &h->retval;                                          zval *hdr_ret = &h->retval;
                                         char *hdr_ns   = h->hdr?h->hdr->ns:NULL;                                          char *hdr_ns   = h->hdr?h->hdr->ns:NULL;
                                         char *hdr_name = Z_STRVAL(h->function_name);                                          char *hdr_name = Z_STRVAL(h->function_name);
                                           HashTable *ht = NULL;
   
   
                                         if (Z_TYPE(h->retval) == IS_OBJECT &&                                          if (Z_TYPE(h->retval) == IS_OBJECT &&
                                             instanceof_function(Z_OBJCE(h->retval), soap_header_class_entry TSRMLS_CC)) {                                              instanceof_function(Z_OBJCE(h->retval), soap_header_class_entry TSRMLS_CC)) {
                                                 HashTable* ht = Z_OBJPROP(h->retval);  
                                                 zval **tmp;                                                  zval **tmp;
                                                 sdlSoapBindingFunctionHeaderPtr *hdr;                                                  sdlSoapBindingFunctionHeaderPtr *hdr;
                                                 smart_str key = {0};                                                  smart_str key = {0};
   
                                                   ht = Z_OBJPROP(h->retval);
                                                 if (zend_hash_find(ht, "namespace", sizeof("namespace"), (void**)&tmp) == SUCCESS &&                                                  if (zend_hash_find(ht, "namespace", sizeof("namespace"), (void**)&tmp) == SUCCESS &&
                                               Z_TYPE_PP(tmp) == IS_STRING) {                                                Z_TYPE_PP(tmp) == IS_STRING) {
                                                         smart_str_appendl(&key, Z_STRVAL_PP(tmp), Z_STRLEN_PP(tmp));                                                          smart_str_appendl(&key, Z_STRVAL_PP(tmp), Z_STRLEN_PP(tmp));
Line 4052  static xmlDocPtr serialize_response_call(sdlFunctionPt Line 4104  static xmlDocPtr serialize_response_call(sdlFunctionPt
                                         }                                          }
   
                                         if (h->function) {                                          if (h->function) {
                                                if (serialize_response_call2(head, h->function, Z_STRVAL(h->function_name), uri, hdr_ret, version, 0 TSRMLS_CC) == SOAP_ENCODED) {                                                xmlNodePtr xmlHdr = NULL;
 
                                                 if (serialize_response_call2(head, h->function, Z_STRVAL(h->function_name), uri, hdr_ret, version, 0, &xmlHdr TSRMLS_CC) == SOAP_ENCODED) {
                                                         use = SOAP_ENCODED;                                                          use = SOAP_ENCODED;
                                                 }                                                  }
                                                   if (ht) {
                                                           set_soap_header_attributes(xmlHdr, ht, version);
                                                   }
                                         } else {                                          } else {
                                                 xmlNodePtr xmlHdr = master_to_xml(hdr_enc, hdr_ret, hdr_use, head TSRMLS_CC);                                                  xmlNodePtr xmlHdr = master_to_xml(hdr_enc, hdr_ret, hdr_use, head TSRMLS_CC);
                                                 if (hdr_name) {                                                  if (hdr_name) {
Line 4064  static xmlDocPtr serialize_response_call(sdlFunctionPt Line 4121  static xmlDocPtr serialize_response_call(sdlFunctionPt
                                                         xmlNsPtr nsptr = encode_add_ns(xmlHdr,hdr_ns);                                                          xmlNsPtr nsptr = encode_add_ns(xmlHdr,hdr_ns);
                                                         xmlSetNs(xmlHdr, nsptr);                                                          xmlSetNs(xmlHdr, nsptr);
                                                 }                                                  }
                                                   if (ht) {
                                                           set_soap_header_attributes(xmlHdr, ht, version);
                                                   }
                                         }                                          }
                                 }                                  }
                                 h = h->next;                                  h = h->next;
Line 4077  static xmlDocPtr serialize_response_call(sdlFunctionPt Line 4137  static xmlDocPtr serialize_response_call(sdlFunctionPt
   
                 body = xmlNewChild(envelope, ns, BAD_CAST("Body"), NULL);                  body = xmlNewChild(envelope, ns, BAD_CAST("Body"), NULL);
   
                if (serialize_response_call2(body, function, function_name, uri, ret, version, 1 TSRMLS_CC) == SOAP_ENCODED) {                if (serialize_response_call2(body, function, function_name, uri, ret, version, 1, NULL TSRMLS_CC) == SOAP_ENCODED) {
                         use = SOAP_ENCODED;                          use = SOAP_ENCODED;
                 }                  }
   
Line 4269  static xmlDocPtr serialize_function_call(zval *this_pt Line 4329  static xmlDocPtr serialize_function_call(zval *this_pt
                                 }                                  }
                                 nsptr = encode_add_ns(h, Z_STRVAL_PP(ns));                                  nsptr = encode_add_ns(h, Z_STRVAL_PP(ns));
                                 xmlSetNs(h, nsptr);                                  xmlSetNs(h, nsptr);
                                set_soap_header_attributes(h, ht, version);
                                if (zend_hash_find(ht, "mustUnderstand", sizeof("mustUnderstand"), (void**)&tmp) == SUCCESS && 
                                    Z_TYPE_PP(tmp) == IS_BOOL && Z_LVAL_PP(tmp)) { 
                                        if (version == SOAP_1_1) { 
                                                xmlSetProp(h, BAD_CAST(SOAP_1_1_ENV_NS_PREFIX":mustUnderstand"), BAD_CAST("1")); 
                                        } else { 
                                                xmlSetProp(h, BAD_CAST(SOAP_1_2_ENV_NS_PREFIX":mustUnderstand"), BAD_CAST("true")); 
                                        } 
                                } 
                                if (zend_hash_find(ht, "actor", sizeof("actor"), (void**)&tmp) == SUCCESS) { 
                                        if (Z_TYPE_PP(tmp) == IS_STRING) { 
                                                if (version == SOAP_1_1) { 
                                                        xmlSetProp(h, BAD_CAST(SOAP_1_1_ENV_NS_PREFIX":actor"), BAD_CAST(Z_STRVAL_PP(tmp))); 
                                                } else { 
                                                        xmlSetProp(h, BAD_CAST(SOAP_1_2_ENV_NS_PREFIX":role"), BAD_CAST(Z_STRVAL_PP(tmp))); 
                                                } 
                                        } else if (Z_TYPE_PP(tmp) == IS_LONG) { 
                                                if (version == SOAP_1_1) { 
                                                        if (Z_LVAL_PP(tmp) == SOAP_ACTOR_NEXT) { 
                                                                xmlSetProp(h, BAD_CAST(SOAP_1_1_ENV_NS_PREFIX":actor"), BAD_CAST(SOAP_1_1_ACTOR_NEXT)); 
                                                        } 
                                                } else { 
                                                        if (Z_LVAL_PP(tmp) == SOAP_ACTOR_NEXT) { 
                                                                xmlSetProp(h, BAD_CAST(SOAP_1_2_ENV_NS_PREFIX":role"), BAD_CAST(SOAP_1_2_ACTOR_NEXT)); 
                                                        } else if (Z_LVAL_PP(tmp) == SOAP_ACTOR_NONE) { 
                                                                xmlSetProp(h, BAD_CAST(SOAP_1_2_ENV_NS_PREFIX":role"), BAD_CAST(SOAP_1_2_ACTOR_NONE)); 
                                                        } else if (Z_LVAL_PP(tmp) == SOAP_ACTOR_UNLIMATERECEIVER) { 
                                                                xmlSetProp(h, BAD_CAST(SOAP_1_2_ENV_NS_PREFIX":role"), BAD_CAST(SOAP_1_2_ACTOR_UNLIMATERECEIVER)); 
                                                        } 
                                                } 
                                        } 
                                } 
                         }                          }
                         zend_hash_move_forward(soap_headers);                          zend_hash_move_forward(soap_headers);
                 }                  }

Removed from v.1.1.1.2  
changed lines
  Added in v.1.1.1.4


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>