--- embedaddon/php/ext/soap/soap.c	2012/02/21 23:48:01	1.1.1.1
+++ embedaddon/php/ext/soap/soap.c	2014/06/15 20:03:55	1.1.1.5
@@ -2,7 +2,7 @@
   +----------------------------------------------------------------------+
   | PHP Version 5                                                        |
   +----------------------------------------------------------------------+
-  | Copyright (c) 1997-2012 The PHP Group                                |
+  | Copyright (c) 1997-2014 The PHP Group                                |
   +----------------------------------------------------------------------+
   | 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        |
@@ -17,7 +17,7 @@
   |          Dmitry Stogov <dmitry@zend.com>                             |
   +----------------------------------------------------------------------+
 */
-/* $Id: soap.c,v 1.1.1.1 2012/02/21 23:48:01 misho Exp $ */
+/* $Id: soap.c,v 1.1.1.5 2014/06/15 20:03:55 misho Exp $ */
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
@@ -26,10 +26,9 @@
 #if HAVE_PHP_SESSION && !defined(COMPILE_DL_SESSION)
 #include "ext/session/php_session.h"
 #endif
-#ifdef ZEND_ENGINE_2
-#  include "zend_exceptions.h"
-#endif
+#include "zend_exceptions.h"
 
+
 static int le_sdl = 0;
 int le_url = 0;
 static int le_service = 0;
@@ -69,10 +68,6 @@ static void delete_service(void *service);
 static void delete_url(void *handle);
 static void delete_hashtable(void *hashtable);
 
-#ifndef ZEND_ENGINE_2
-static void soap_call_function_handler(INTERNAL_FUNCTION_PARAMETERS, zend_property_reference *property_reference);
-#endif
-
 static void soap_error_handler(int error_num, const char *error_filename, const uint error_lineno, const char *format, va_list args);
 
 #define SOAP_SERVER_BEGIN_CODE() \
@@ -90,7 +85,6 @@ static void soap_error_handler(int error_num, const ch
 	SOAP_GLOBAL(error_object) = _old_error_object;\
 	SOAP_GLOBAL(soap_version) = _old_soap_version;
 
-#ifdef ZEND_ENGINE_2
 #define SOAP_CLIENT_BEGIN_CODE() \
 	zend_bool _old_handler = SOAP_GLOBAL(use_soap_error_handler);\
 	char* _old_error_code = SOAP_GLOBAL(error_code);\
@@ -134,23 +128,7 @@ static void soap_error_handler(int error_num, const ch
 	if (_bailout) {\
 		zend_bailout();\
 	}
-#else
-#define SOAP_CLIENT_BEGIN_CODE() \
-	zend_bool _old_handler = SOAP_GLOBAL(use_soap_error_handler);\
-	char* _old_error_code = SOAP_GLOBAL(error_code);\
-	zval* _old_error_object = SOAP_GLOBAL(error_object);\
-	int _old_soap_version = SOAP_GLOBAL(soap_version);\
-	SOAP_GLOBAL(use_soap_error_handler) = 1;\
-	SOAP_GLOBAL(error_code) = "Client";\
-	SOAP_GLOBAL(error_object) = this_ptr;
 
-#define SOAP_CLIENT_END_CODE() \
-	SOAP_GLOBAL(use_soap_error_handler) = _old_handler;\
-	SOAP_GLOBAL(error_code) = _old_error_code;\
-	SOAP_GLOBAL(error_object) = _old_error_object;\
-	SOAP_GLOBAL(soap_version) = _old_soap_version;
-#endif
-
 #define FETCH_THIS_SDL(ss) \
 	{ \
 		zval **__tmp; \
@@ -215,27 +193,6 @@ PHP_MINIT_FUNCTION(soap);
 PHP_MSHUTDOWN_FUNCTION(soap);
 PHP_MINFO_FUNCTION(soap);
 
-#ifndef ZEND_ENGINE_2
-# ifndef PHP_METHOD
-#  define PHP_METHOD(classname, name)	ZEND_NAMED_FUNCTION(ZEND_FN(classname##_##name))
-#  define PHP_ME(classname, name, arg_info, flags)	ZEND_NAMED_FE(name, ZEND_FN(classname##_##name), arg_info)
-# endif
-
-static char *zend_str_tolower_copy(char *dest, const char *source, unsigned int length)
-{
-	register unsigned char *str = (unsigned char*)source;
-	register unsigned char *result = (unsigned char*)dest;
-	register unsigned char *end = str + length;
-
-	while (str < end) {
-		*result++ = tolower((int)*str++);
-	}
-	*result = *end;
-
-	return dest;
-}
-#endif
-
 /*
   Registry Functions
   TODO: this!
@@ -276,9 +233,7 @@ PHP_METHOD(SoapVar, SoapVar);
 
 /* SoapFault Functions */
 PHP_METHOD(SoapFault, SoapFault);
-#ifdef ZEND_ENGINE_2
 PHP_METHOD(SoapFault, __toString);
-#endif
 
 /* SoapParam Functions */
 PHP_METHOD(SoapParam, SoapParam);
@@ -289,7 +244,6 @@ PHP_METHOD(SoapHeader, SoapHeader);
 #define SOAP_CTOR(class_name, func_name, arginfo, flags) PHP_ME(class_name, func_name, arginfo, flags)
 
 /* {{{ arginfo */
-#ifdef ZEND_ENGINE_2
 ZEND_BEGIN_ARG_INFO(arginfo_soap__void, 0)
 ZEND_END_ARG_INFO()
 
@@ -429,43 +383,6 @@ ZEND_END_ARG_INFO()
 ZEND_BEGIN_ARG_INFO_EX(arginfo_soap_is_soap_fault, 0, 0, 1)
 	ZEND_ARG_INFO(0, object)
 ZEND_END_ARG_INFO()
-#else
-unsigned char arginfo_soapclient___call[] = { 2, BYREF_NONE, BYREF_NONE };
-unsigned char arginfo_soapclient___soapcall[] = { 5, BYREF_NONE, BYREF_NONE, BYREF_NONE, BYREF_NONE, BYREF_FORCE };
-# define arginfo_soapclient_soapclient 					NULL
-# define arginfo_soapclient___getlastrequest 			NULL
-# define arginfo_soapclient___getlastresponse 			NULL
-# define arginfo_soapclient___getlastrequestheaders 	NULL
-# define arginfo_soapclient___getlastresponseheaders 	NULL
-# define arginfo_soapclient___getfunctions				NULL
-# define arginfo_soapclient___gettypes					NULL
-# define arginfo_soapclient___dorequest					NULL
-# define arginfo_soapclient___setcookie					NULL
-# define arginfo_soapclient___setlocation				NULL
-# define arginfo_soapclient___setsoapheaders			NULL
-
-# define arginfo_soapserver_soapserver					NULL
-# define arginfo_soapserver_setpersistence				NULL
-# define arginfo_soapserver_setclass					NULL
-# define arginfo_soapserver_setobject					NULL
-# define arginfo_soapserver_addfunction					NULL
-# define arginfo_soapserver_getfunctions				NULL
-# defina arginfo_soapserver_handle						NULL
-# define arginfo_soapserver_fault						NULL
-# define arginfo_soapserver_addsoapheader				NULL
-
-# define arginfo_soapvar_soapvar						NULL
-
-# define arginfo_soapfault_soapfault					NULL
-
-# define arginfo_soapheader_soapheader					NULL
-
-# define arginfo_soapparam_soapparam					NULL
-
-# define arginfo_soap_use_soap_error_handler			NULL
-
-# define arginfo_soap_is_soap_fault						NULL
-#endif
 /* }}} */
 
 static const zend_function_entry soap_functions[] = {
@@ -476,9 +393,7 @@ static const zend_function_entry soap_functions[] = {
 
 static const zend_function_entry soap_fault_functions[] = {
 	SOAP_CTOR(SoapFault, SoapFault, arginfo_soapfault_soapfault, 0)
-#ifdef ZEND_ENGINE_2
 	PHP_ME(SoapFault, __toString, arginfo_soap__void, 0)
-#endif
 	PHP_FE_END
 };
 
@@ -548,23 +463,6 @@ zend_module_entry soap_module_entry = {
 ZEND_GET_MODULE(soap)
 #endif
 
-#ifndef ZEND_ENGINE_2
-# define OnUpdateLong OnUpdateInt
-#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)
 {
 	char *p;
@@ -578,18 +476,43 @@ ZEND_INI_MH(OnUpdateCacheMode)
 
 	*p = (char)atoi(new_value);
 
-	if (SOAP_GLOBAL(cache_enabled)) {
-		SOAP_GLOBAL(cache) = SOAP_GLOBAL(cache_mode);
-	} else {
-		SOAP_GLOBAL(cache) = 0;
+	return SUCCESS;
+}
+
+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;
 }
 
 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)
-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)
 STD_PHP_INI_ENTRY("soap.wsdl_cache_ttl",         "86400", PHP_INI_ALL, OnUpdateLong,
                   cache_ttl, zend_soap_globals, soap_globals)
@@ -694,18 +617,10 @@ PHP_MINIT_FUNCTION(soap)
 	ZEND_INIT_MODULE_GLOBALS(soap, php_soap_init_globals, NULL);
 	REGISTER_INI_ENTRIES();
 
-#ifndef ZEND_ENGINE_2
-	/* Enable php stream/wrapper support for libxml */
-	xmlRegisterDefaultInputCallbacks();
-	xmlRegisterInputCallbacks(php_stream_xmlIO_match_wrapper, php_stream_xmlIO_open_wrapper,
-			php_stream_xmlIO_read, php_stream_xmlIO_close);
-#endif
-
 	/* Register SoapClient class */
 	/* BIG NOTE : THIS EMITS AN COMPILATION WARNING UNDER ZE2 - handle_function_call deprecated.
 		soap_call_function_handler should be of type struct _zend_function, not (*handle_function_call).
 	*/
-#ifdef ZEND_ENGINE_2
 	{
 		zend_internal_function fe;
 
@@ -717,17 +632,11 @@ PHP_MINIT_FUNCTION(soap)
 		fe.prototype = NULL;
 		fe.num_args = 2;
 		fe.arg_info = NULL;
-		fe.pass_rest_by_reference = 0;
 
 		INIT_OVERLOADED_CLASS_ENTRY(ce, PHP_SOAP_CLIENT_CLASSNAME, soap_client_functions,
 			(zend_function *)&fe, NULL, NULL);
 		soap_class_entry = zend_register_internal_class(&ce TSRMLS_CC);
 	}
-#else
-	INIT_OVERLOADED_CLASS_ENTRY(ce, PHP_SOAP_CLIENT_CLASSNAME, soap_client_functions, soap_call_function_handler, NULL, NULL);
-	soap_class_entry = zend_register_internal_class(&ce TSRMLS_CC);
-#endif
-
 	/* Register SoapVar class */
 	INIT_CLASS_ENTRY(ce, PHP_SOAP_VAR_CLASSNAME, soap_var_functions);
 	soap_var_class_entry = zend_register_internal_class(&ce TSRMLS_CC);
@@ -738,11 +647,7 @@ PHP_MINIT_FUNCTION(soap)
 
 	/* Register SoapFault class */
 	INIT_CLASS_ENTRY(ce, PHP_SOAP_FAULT_CLASSNAME, soap_fault_functions);
-#ifdef ZEND_ENGINE_2
 	soap_fault_class_entry = zend_register_internal_class_ex(&ce, zend_exception_get_default(TSRMLS_C), NULL TSRMLS_CC);
-#else
-	soap_fault_class_entry = zend_register_internal_class(&ce TSRMLS_CC);
-#endif
 
 	/* Register SoapParam class */
 	INIT_CLASS_ENTRY(ce, PHP_SOAP_PARAM_CLASSNAME, soap_param_functions);
@@ -880,9 +785,6 @@ PHP_METHOD(SoapParam, SoapParam)
 		return;
 	}
 
-#ifndef ZEND_ENGINE_2
-	zval_add_ref(&data);
-#endif
 	add_property_stringl(this_ptr, "param_name", name, name_length, 1);
 	add_property_zval(this_ptr, "param_data", data);
 }
@@ -913,9 +815,6 @@ PHP_METHOD(SoapHeader, SoapHeader)
 	add_property_stringl(this_ptr, "namespace", ns, ns_len, 1);
 	add_property_stringl(this_ptr, "name", name, name_len, 1);
 	if (data) {
-#ifndef ZEND_ENGINE_2
-		zval_add_ref(&data);
-#endif
 		add_property_zval(this_ptr, "data", data);
 	}
 	add_property_bool(this_ptr, "mustUnderstand", must_understand);
@@ -987,7 +886,6 @@ PHP_METHOD(SoapFault, SoapFault)
 /* }}} */
 
 
-#ifdef ZEND_ENGINE_2
 /* {{{ proto object SoapFault::SoapFault ( string faultcode, string faultstring [, string faultactor [, mixed detail [, string faultname [, mixed headerfault]]]])
    SoapFault constructor */
 PHP_METHOD(SoapFault, __toString)
@@ -1030,7 +928,6 @@ PHP_METHOD(SoapFault, __toString)
 	RETURN_STRINGL(str, len, 0);
 }
 /* }}} */
-#endif
 
 /* {{{ proto object SoapVar::SoapVar ( mixed data, int encoding [, string type_name [, string type_namespace [, string node_name [, string node_namespace]]]])
    SoapVar constructor */
@@ -1056,9 +953,6 @@ PHP_METHOD(SoapVar, SoapVar)
 	}
 
 	if (data) {
-#ifndef ZEND_ENGINE_2
-		zval_add_ref(&data);
-#endif
 		add_property_zval(this_ptr, "enc_value", data);
 	}
 
@@ -1220,7 +1114,7 @@ PHP_METHOD(SoapServer, SoapServer)
 	memset(service, 0, sizeof(soapService));
 	service->send_errors = 1;
 
-	cache_wsdl = SOAP_GLOBAL(cache);
+	cache_wsdl = SOAP_GLOBAL(cache_enabled) ? SOAP_GLOBAL(cache_mode) : 0;
 
 	if (options != NULL) {
 		HashTable *ht = Z_ARRVAL_P(options);
@@ -1315,7 +1209,7 @@ PHP_METHOD(SoapServer, SoapServer)
 		service->typemap = soap_create_typemap(service->sdl, typemap_ht TSRMLS_CC);
 	}
 
-	ret = zend_list_insert(service, le_service);
+	ret = zend_list_insert(service, le_service TSRMLS_CC);
 	add_property_resource(this_ptr, "service", ret);
 
 	SOAP_SERVER_END_CODE();
@@ -1360,11 +1254,8 @@ PHP_METHOD(SoapServer, setClass)
 {
 	soapServicePtr service;
 	char *classname;
-#ifdef ZEND_ENGINE_2		
 	zend_class_entry **ce;
-#else
-	zend_class_entry *ce;
-#endif
+
 	int classname_len, found, num_args = 0;
 	zval ***argv = NULL;
 
@@ -1376,20 +1267,12 @@ PHP_METHOD(SoapServer, setClass)
 		return;
 	}
 
-#ifdef ZEND_ENGINE_2		
 	found = zend_lookup_class(classname, classname_len, &ce TSRMLS_CC);
-#else
-	char *class_name = estrdup(classname);
-	found = zend_hash_find(EG(class_table), php_strtolower(class_name, classname_len), classname_len + 1, (void **)&ce);
-	efree(class_name);
-#endif
+
 	if (found != FAILURE) {
 		service->type = SOAP_CLASS;
-#ifdef ZEND_ENGINE_2
 		service->soap_class.ce = *ce;
-#else
-		service->soap_class.ce = ce;
-#endif
+
 		service->soap_class.persistance = SOAP_PERSISTENCE_REQUEST;
 		service->soap_class.argc = num_args;
 		if (service->soap_class.argc > 0) {
@@ -1401,7 +1284,7 @@ PHP_METHOD(SoapServer, setClass)
 			}
 		}
 	} 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;
 	}
 
@@ -1532,7 +1415,7 @@ PHP_METHOD(SoapServer, addFunction)
 				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) {
-					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;
 				}
 
@@ -1554,7 +1437,7 @@ PHP_METHOD(SoapServer, addFunction)
 		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) {
-			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;
 		}
 		if (service->soap_functions.ft == NULL) {
@@ -1666,7 +1549,7 @@ PHP_METHOD(SoapServer, handle)
 
 	ALLOC_INIT_ZVAL(retval);
 
-	if (php_start_ob_buffer(NULL, 0, 0 TSRMLS_CC) != SUCCESS) {
+	if (php_output_start_default(TSRMLS_C) != SUCCESS) {
 		php_error_docref(NULL TSRMLS_CC, E_ERROR,"ob_start failed");
 	}
 
@@ -1751,17 +1634,15 @@ PHP_METHOD(SoapServer, handle)
 	old_soap_version = SOAP_GLOBAL(soap_version);
 	function = deserialize_function_call(service->sdl, doc_request, service->actor, &function_name, &num_params, &params, &soap_version, &soap_headers TSRMLS_CC);
 	xmlFreeDoc(doc_request);
-	
-#ifdef ZEND_ENGINE_2
+
 	if (EG(exception)) {
-		php_end_ob_buffer(0, 0 TSRMLS_CC);
+		php_output_discard(TSRMLS_C);
 		if (Z_TYPE_P(EG(exception)) == IS_OBJECT &&
 		    instanceof_function(Z_OBJCE_P(EG(exception)), soap_fault_class_entry TSRMLS_CC)) {
 			soap_server_fault_ex(function, EG(exception), NULL TSRMLS_CC);
 		}
 		goto fail;
 	}
-#endif
 
 	service->soap_headers_ptr = &soap_headers;
 
@@ -1788,7 +1669,7 @@ PHP_METHOD(SoapServer, handle)
 			}
 		}
 #endif
-		/* If new session or something wierd happned */
+		/* If new session or something weird happned */
 		if (soap_obj == NULL) {
 			zval *tmp_soap;
 
@@ -1796,7 +1677,6 @@ PHP_METHOD(SoapServer, handle)
 			object_init_ex(tmp_soap, service->soap_class.ce);
 
 			/* Call constructor */
-#ifdef ZEND_ENGINE_2
 			if (zend_hash_exists(&Z_OBJCE_P(tmp_soap)->function_table, ZEND_CONSTRUCTOR_FUNC_NAME, sizeof(ZEND_CONSTRUCTOR_FUNC_NAME))) {
 				zval c_ret, constructor;
 
@@ -1808,7 +1688,7 @@ PHP_METHOD(SoapServer, handle)
 					php_error_docref(NULL TSRMLS_CC, E_ERROR, "Error calling constructor");
 				}
 				if (EG(exception)) {
-					php_end_ob_buffer(0, 0 TSRMLS_CC);
+					php_output_discard(TSRMLS_C);
 					if (Z_TYPE_P(EG(exception)) == IS_OBJECT &&
 					    instanceof_function(Z_OBJCE_P(EG(exception)), soap_fault_class_entry TSRMLS_CC)) {
 						soap_server_fault_ex(function, EG(exception), NULL TSRMLS_CC);
@@ -1821,9 +1701,6 @@ PHP_METHOD(SoapServer, handle)
 				zval_dtor(&constructor);
 				zval_dtor(&c_ret);
 			} else {
-#else
-      {
-#endif
 				int class_name_len = strlen(service->soap_class.ce->name);
 				char *class_name = emalloc(class_name_len+1);
 
@@ -1838,9 +1715,9 @@ PHP_METHOD(SoapServer, handle)
 					if (call_user_function(NULL, &tmp_soap, &constructor, &c_ret, service->soap_class.argc, service->soap_class.argv TSRMLS_CC) == FAILURE) {
 						php_error_docref(NULL TSRMLS_CC, E_ERROR, "Error calling constructor");
 					}
-#ifdef ZEND_ENGINE_2
+
 					if (EG(exception)) {
-						php_end_ob_buffer(0, 0 TSRMLS_CC);
+						php_output_discard(TSRMLS_C);
 						if (Z_TYPE_P(EG(exception)) == IS_OBJECT &&
 						    instanceof_function(Z_OBJCE_P(EG(exception)), soap_fault_class_entry TSRMLS_CC)) {
 							soap_server_fault_ex(function, EG(exception), NULL TSRMLS_CC);
@@ -1851,7 +1728,7 @@ PHP_METHOD(SoapServer, handle)
 						zval_ptr_dtor(&tmp_soap);
 						goto fail;
 					}
-#endif
+
 					zval_dtor(&constructor);
 					zval_dtor(&c_ret);
 				}
@@ -1920,14 +1797,13 @@ PHP_METHOD(SoapServer, handle)
 					    Z_TYPE_PP(tmp) != IS_NULL) {
 						headerfault = *tmp;
 					}
-					php_end_ob_buffer(0, 0 TSRMLS_CC);
+					php_output_discard(TSRMLS_C);
 					soap_server_fault_ex(function, &h->retval, h TSRMLS_CC);
 					efree(fn_name);
 					if (service->type == SOAP_CLASS && soap_obj) {zval_ptr_dtor(&soap_obj);}
 					goto fail;
-#ifdef ZEND_ENGINE_2
 				} else if (EG(exception)) {
-					php_end_ob_buffer(0, 0 TSRMLS_CC);
+					php_output_discard(TSRMLS_C);
 					if (Z_TYPE_P(EG(exception)) == IS_OBJECT &&
 					    instanceof_function(Z_OBJCE_P(EG(exception)), soap_fault_class_entry TSRMLS_CC)) {
 						zval *headerfault = NULL, **tmp;
@@ -1941,7 +1817,6 @@ PHP_METHOD(SoapServer, handle)
 					efree(fn_name);
 					if (service->type == SOAP_CLASS && soap_obj) {zval_ptr_dtor(&soap_obj);}
 					goto fail;
-#endif
 				}
 			} else if (h->mustUnderstand) {
 				soap_server_fault("MustUnderstand","Header not understood", NULL, NULL, NULL TSRMLS_CC);
@@ -1975,9 +1850,8 @@ PHP_METHOD(SoapServer, handle)
 	}
 	efree(fn_name);
 
-#ifdef ZEND_ENGINE_2
 	if (EG(exception)) {
-		php_end_ob_buffer(0, 0 TSRMLS_CC);
+		php_output_discard(TSRMLS_C);
 		if (Z_TYPE_P(EG(exception)) == IS_OBJECT &&
 		    instanceof_function(Z_OBJCE_P(EG(exception)), soap_fault_class_entry TSRMLS_CC)) {
 			soap_server_fault_ex(function, EG(exception), NULL TSRMLS_CC);
@@ -1993,13 +1867,13 @@ PHP_METHOD(SoapServer, handle)
 		}
 		goto fail;
 	}
-#endif
+
 	if (call_status == SUCCESS) {
 		char *response_name;
 
 		if (Z_TYPE_P(retval) == IS_OBJECT &&
 		    instanceof_function(Z_OBJCE_P(retval), soap_fault_class_entry TSRMLS_CC)) {
-			php_end_ob_buffer(0, 0 TSRMLS_CC);
+			php_output_discard(TSRMLS_C);
 			soap_server_fault_ex(function, retval, NULL TSRMLS_CC);
 			goto fail;
 		}
@@ -2018,9 +1892,8 @@ PHP_METHOD(SoapServer, handle)
 		return;
 	}
 
-#ifdef ZEND_ENGINE_2
 	if (EG(exception)) {
-		php_end_ob_buffer(0, 0 TSRMLS_CC);
+		php_output_discard(TSRMLS_C);
 		if (Z_TYPE_P(EG(exception)) == IS_OBJECT &&
 		    instanceof_function(Z_OBJCE_P(EG(exception)), soap_fault_class_entry TSRMLS_CC)) {
 			soap_server_fault_ex(function, EG(exception), NULL TSRMLS_CC);
@@ -2036,10 +1909,9 @@ PHP_METHOD(SoapServer, handle)
 		}
 		goto fail;
 	}
-#endif
 
 	/* Flush buffer */
-	php_end_ob_buffer(0, 0 TSRMLS_CC);
+	php_output_discard(TSRMLS_C);
 
 	if (doc_return) {
 		/* xmlDocDumpMemoryEnc(doc_return, &buf, &size, XML_CHAR_ENCODING_UTF8); */
@@ -2057,39 +1929,14 @@ PHP_METHOD(SoapServer, handle)
 
 		xmlFreeDoc(doc_return);
 
-		if (zend_ini_long("zlib.output_compression", sizeof("zlib.output_compression"), 0) &&				
-		    zend_hash_exists(EG(function_table), "ob_gzhandler", sizeof("ob_gzhandler"))) {
-			zval nm_ob_gzhandler;
-			zval str;
-			zval mode;
-			zval result;
-			zval *params[2];
-
-			INIT_ZVAL(result);
-			ZVAL_STRINGL(&nm_ob_gzhandler, "ob_gzhandler", sizeof("ob_gzhandler") - 1, 0);
-			INIT_PZVAL(&str);
-			ZVAL_STRINGL(&str, (char*)buf, size, 0);
-			params[0] = &str;
-			INIT_PZVAL(&mode);
-			ZVAL_LONG(&mode, PHP_OUTPUT_HANDLER_START | PHP_OUTPUT_HANDLER_END);
-			params[1] = &mode;
-			if (call_user_function(CG(function_table), NULL, &nm_ob_gzhandler, &result, 2, params TSRMLS_CC) != FAILURE &&
-			    Z_TYPE(result) == IS_STRING &&
-				zend_alter_ini_entry("zlib.output_compression", sizeof("zlib.output_compression"), "0", sizeof("0")-1, PHP_INI_USER, PHP_INI_STAGE_RUNTIME) == SUCCESS) {
-				xmlFree(buf);
-				buf = NULL;
-				snprintf(cont_len, sizeof(cont_len), "Content-Length: %d", Z_STRLEN(result));
-				sapi_add_header(cont_len, strlen(cont_len), 1);
-				php_write(Z_STRVAL(result), Z_STRLEN(result) TSRMLS_CC);
-			}
-			zval_dtor(&result);
-		}
-		if (buf) {
+		if (zend_ini_long("zlib.output_compression", sizeof("zlib.output_compression"), 0)) {
+			sapi_add_header("Connection: close", sizeof("Connection: close")-1, 1);
+		} else {
 			snprintf(cont_len, sizeof(cont_len), "Content-Length: %d", size);
 			sapi_add_header(cont_len, strlen(cont_len), 1);
-			php_write(buf, size TSRMLS_CC);
-			xmlFree(buf);
 		}
+		php_write(buf, size TSRMLS_CC);
+		xmlFree(buf);
 	} else {
 		sapi_add_header("HTTP/1.1 202 Accepted", sizeof("HTTP/1.1 202 Accepted")-1, 1);
 		sapi_add_header("Content-Length: 0", sizeof("Content-Length: 0")-1, 1);
@@ -2228,47 +2075,22 @@ static void soap_server_fault_ex(sdlFunctionPtr functi
 	if (use_http_error_status) {
 		sapi_add_header("HTTP/1.1 500 Internal Service Error", sizeof("HTTP/1.1 500 Internal Service Error")-1, 1);
 	}
+	if (zend_ini_long("zlib.output_compression", sizeof("zlib.output_compression"), 0)) {
+		sapi_add_header("Connection: close", sizeof("Connection: close")-1, 1);
+	} else {
+		snprintf(cont_len, sizeof(cont_len), "Content-Length: %d", size);
+		sapi_add_header(cont_len, strlen(cont_len), 1);
+	}
 	if (soap_version == SOAP_1_2) {
 		sapi_add_header("Content-Type: application/soap+xml; charset=utf-8", sizeof("Content-Type: application/soap+xml; charset=utf-8")-1, 1);
 	} else {
 		sapi_add_header("Content-Type: text/xml; charset=utf-8", sizeof("Content-Type: text/xml; charset=utf-8")-1, 1);
 	}
 
-	if (zend_ini_long("zlib.output_compression", sizeof("zlib.output_compression"), 0) &&				
-	    zend_hash_exists(EG(function_table), "ob_gzhandler", sizeof("ob_gzhandler"))) {
-		zval nm_ob_gzhandler;
-		zval str;
-		zval mode;
-		zval result;
-		zval *params[2];
+	php_write(buf, size TSRMLS_CC);
 
-		INIT_ZVAL(result);
-		ZVAL_STRINGL(&nm_ob_gzhandler, "ob_gzhandler", sizeof("ob_gzhandler") - 1, 0);
-		INIT_PZVAL(&str);
-		ZVAL_STRINGL(&str, (char*)buf, size, 0);
-		params[0] = &str;
-		INIT_PZVAL(&mode);
-		ZVAL_LONG(&mode, PHP_OUTPUT_HANDLER_START | PHP_OUTPUT_HANDLER_END);
-		params[1] = &mode;
-		if (call_user_function(CG(function_table), NULL, &nm_ob_gzhandler, &result, 2, params TSRMLS_CC) != FAILURE &&
-		    Z_TYPE(result) == IS_STRING &&
-			zend_alter_ini_entry("zlib.output_compression", sizeof("zlib.output_compression"), "0", sizeof("0")-1, PHP_INI_USER, PHP_INI_STAGE_RUNTIME) == SUCCESS) {
-			xmlFree(buf);
-			buf = NULL;
-			snprintf(cont_len, sizeof(cont_len), "Content-Length: %d", Z_STRLEN(result));
-			sapi_add_header(cont_len, strlen(cont_len), 1);
-			php_write(Z_STRVAL(result), Z_STRLEN(result) TSRMLS_CC);
-		}
-		zval_dtor(&result);
-	}
-	if (buf) {
-		snprintf(cont_len, sizeof(cont_len), "Content-Length: %d", size);
-		sapi_add_header(cont_len, strlen(cont_len), 1);
-		php_write(buf, size TSRMLS_CC);
-		xmlFree(buf);
-	}
-
 	xmlFreeDoc(doc_return);
+	xmlFree(buf);
 	zend_clear_exception(TSRMLS_C);
 }
 
@@ -2306,7 +2128,6 @@ static void soap_error_handler(int error_num, const ch
 	if (SOAP_GLOBAL(error_object) &&
 	    Z_TYPE_P(SOAP_GLOBAL(error_object)) == IS_OBJECT &&
 	    instanceof_function(Z_OBJCE_P(SOAP_GLOBAL(error_object)), soap_class_entry TSRMLS_CC)) {
-#ifdef ZEND_ENGINE_2
 		zval **tmp;
 		int use_exceptions = 0;
 
@@ -2379,9 +2200,6 @@ static void soap_error_handler(int error_num, const ch
 			/* Ignore libxml warnings during WSDL parsing */
 			call_old_error_handler(error_num, error_filename, error_lineno, format, args);
 		}
-#else
-		call_old_error_handler(error_num, error_filename, error_lineno, format, args);
-#endif
 	} else {
 		int old = PG(display_errors);
 		int fault = 0;
@@ -2431,11 +2249,11 @@ static void soap_error_handler(int error_num, const ch
 				}
 
 				/* Get output buffer and send as fault detials */
-				if (php_ob_get_length(&outbuflen TSRMLS_CC) != FAILURE && Z_LVAL(outbuflen) != 0) {
+				if (php_output_get_length(&outbuflen TSRMLS_CC) != FAILURE && Z_LVAL(outbuflen) != 0) {
 					ALLOC_INIT_ZVAL(outbuf);
-					php_ob_get_buffer(outbuf TSRMLS_CC);
+					php_output_get_contents(outbuf TSRMLS_CC);
 				}
-				php_end_ob_buffer(0, 0 TSRMLS_CC);
+				php_output_discard(TSRMLS_C);
 
 			}
 			INIT_ZVAL(fault_obj);
@@ -2512,7 +2330,7 @@ PHP_METHOD(SoapClient, SoapClient)
 		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) {
 		HashTable *ht = Z_ARRVAL_P(options);
@@ -2591,7 +2409,7 @@ PHP_METHOD(SoapClient, SoapClient)
 		if (zend_hash_find(ht, "local_cert", sizeof("local_cert"), (void**)&tmp) == SUCCESS &&
 		    Z_TYPE_PP(tmp) == IS_STRING) {
 		  if (!context) {
-  			context = php_stream_context_alloc();
+  			context = php_stream_context_alloc(TSRMLS_C);
 		  }
  			php_stream_context_set_option(context, "ssl", "local_cert", *tmp);
 			if (zend_hash_find(ht, "passphrase", sizeof("passphrase"), (void**)&tmp) == SUCCESS &&
@@ -2604,13 +2422,13 @@ PHP_METHOD(SoapClient, SoapClient)
 				Z_LVAL_PP(tmp) == 1) {
 			add_property_long(this_ptr, "trace", 1);
 		}
-#ifdef ZEND_ENGINE_2
+
 		if (zend_hash_find(ht, "exceptions", sizeof("exceptions"), (void**)&tmp) == SUCCESS &&
 		    (Z_TYPE_PP(tmp) == IS_BOOL || Z_TYPE_PP(tmp) == IS_LONG) &&
 				Z_LVAL_PP(tmp) == 0) {
 			add_property_bool(this_ptr, "_exceptions", 0);
 		}
-#endif
+
 		if (zend_hash_find(ht, "compression", sizeof("compression"), (void**)&tmp) == SUCCESS &&
 		    Z_TYPE_PP(tmp) == IS_LONG &&
 	      zend_hash_exists(EG(function_table), "gzinflate", sizeof("gzinflate")) &&
@@ -2638,9 +2456,8 @@ PHP_METHOD(SoapClient, SoapClient)
 
 			MAKE_STD_ZVAL(class_map);
 			MAKE_COPY_ZVAL(tmp, class_map);
-#ifdef ZEND_ENGINE_2
 			Z_DELREF_P(class_map);
-#endif
+
 			add_property_zval(this_ptr, "_classmap", class_map);
 		}
 
@@ -2675,6 +2492,11 @@ PHP_METHOD(SoapClient, SoapClient)
 		    Z_TYPE_PP(tmp) == IS_STRING) {
 			add_property_stringl(this_ptr, "_user_agent", Z_STRVAL_PP(tmp), Z_STRLEN_PP(tmp), 1);
 		}
+		
+		if (zend_hash_find(ht, "keep_alive", sizeof("keep_alive"), (void**)&tmp) == SUCCESS &&
+				(Z_TYPE_PP(tmp) == IS_BOOL || Z_TYPE_PP(tmp) == IS_LONG) && Z_LVAL_PP(tmp) == 0) {
+			add_property_long(this_ptr, "_keep_alive", 0);
+		}
 	} else if (Z_TYPE_P(wsdl) == IS_NULL) {
 		php_error_docref(NULL TSRMLS_CC, E_ERROR, "'location' and 'uri' options are required in nonWSDL mode");
 	}
@@ -2688,7 +2510,7 @@ PHP_METHOD(SoapClient, SoapClient)
 		SOAP_GLOBAL(soap_version) = soap_version;
 
 		sdl = get_sdl(this_ptr, Z_STRVAL_P(wsdl), cache_wsdl TSRMLS_CC);
-		ret = zend_list_insert(sdl, le_sdl);
+		ret = zend_list_insert(sdl, le_sdl TSRMLS_CC);
 
 		add_property_resource(this_ptr, "sdl", ret);
 
@@ -2700,7 +2522,7 @@ PHP_METHOD(SoapClient, SoapClient)
 		if (typemap) {
 			int ret;
 
-			ret = zend_list_insert(typemap, le_typemap);
+			ret = zend_list_insert(typemap, le_typemap TSRMLS_CC);
 			add_property_resource(this_ptr, "typemap", ret);
 		}
 	}
@@ -2958,7 +2780,7 @@ static void do_soap_call(zval* this_ptr,
 			zval_copy_ctor(return_value);
 		}
 	}
-#ifdef ZEND_ENGINE_2
+
 	if (!EG(exception) &&
 	    Z_TYPE_P(return_value) == IS_OBJECT &&
 	    instanceof_function(Z_OBJCE_P(return_value), soap_fault_class_entry TSRMLS_CC) &&
@@ -2970,7 +2792,7 @@ static void do_soap_call(zval* this_ptr,
 		MAKE_COPY_ZVAL(&return_value, exception);
 		zend_throw_exception_object(exception TSRMLS_CC);
 	}
-#endif
+
 	if (SOAP_GLOBAL(encoding) != NULL) {
 		xmlCharEncCloseFunc(SOAP_GLOBAL(encoding));
 	}
@@ -3379,41 +3201,6 @@ PHP_METHOD(SoapClient, __setLocation)
 }
 /* }}} */
 
-#ifndef ZEND_ENGINE_2
-static void soap_call_function_handler(INTERNAL_FUNCTION_PARAMETERS, zend_property_reference *property_reference)
-{
-	zval *object = property_reference->object;
-	zend_overloaded_element *function_name = (zend_overloaded_element *)property_reference->elements_list->tail->data;
-	char *function = Z_STRVAL(function_name->element);
-	zend_function *builtin_function;
-
-	/*
-	   Find if the function being called is already defined...
-	  ( IMHO: zend should handle this functionality )
-	*/
-	if (zend_hash_find(&Z_OBJCE_P(this_ptr)->function_table, function, Z_STRLEN(function_name->element) + 1, (void **) &builtin_function) == SUCCESS) {
-		builtin_function->internal_function.handler(INTERNAL_FUNCTION_PARAM_PASSTHRU);
-	} else {
-		int arg_count = ZEND_NUM_ARGS();
-		zval **arguments = (zval **) safe_emalloc(sizeof(zval *), arg_count, 0);
-		zval **soap_headers_p
-		HashTable *soap_headers;
-
-		zend_get_parameters_array(ht, arg_count, arguments);
-
-		if (zend_hash_find(Z_OBJPROP_P(this_ptr), "__default_headers", sizeof("__default_properties"), (void **) soap_headers_p)==SUCCESS
-			&& Z_TYPE_P(soap_headers_p)==IS_ARRAY) {
-			soap_headers = Z_ARRVAL_P(soap_headers_p);
-		} else {
-			soap_headers = NULL;
-		}
-		do_soap_call(this_ptr, function, Z_STRLEN(function_name->element) + 1, arg_count, arguments, return_value, NULL, NULL, NULL, soap_headers, NULL TSRMLS_CC);
-		efree(arguments);
-	}
-	zval_dtor(&function_name->element);
-}
-#endif
-
 static void clear_soap_fault(zval *obj TSRMLS_DC)
 {
 	if (obj != NULL && obj->type == IS_OBJECT) {
@@ -3426,9 +3213,8 @@ zval* add_soap_fault(zval *obj, char *fault_code, char
 	zval *fault;
 	ALLOC_INIT_ZVAL(fault);
 	set_soap_fault(fault, NULL, fault_code, fault_string, fault_actor, fault_detail, NULL TSRMLS_CC);
-#ifdef ZEND_ENGINE_2
 	Z_DELREF_P(fault);
-#endif
+
 	add_property_zval(obj, "__soap_fault", fault);
 	return fault;
 }
@@ -3440,9 +3226,7 @@ static void set_soap_fault(zval *obj, char *fault_code
 	}
 	
 	add_property_string(obj, "faultstring", fault_string ? fault_string : "", 1);
-#ifdef ZEND_ENGINE_2
 	zend_update_property_string(zend_exception_get_default(TSRMLS_C), obj, "message", sizeof("message")-1, (fault_string ? fault_string : "") TSRMLS_CC);
-#endif
 	
 	if (fault_code != NULL) {
 		int soap_version = SOAP_GLOBAL(soap_version);
@@ -3488,7 +3272,7 @@ static void set_soap_fault(zval *obj, char *fault_code
 	}
 }
 
-static void deserialize_parameters(xmlNodePtr params, sdlFunctionPtr function, int *num_params, zval ***parameters)
+static void deserialize_parameters(xmlNodePtr params, sdlFunctionPtr function, int *num_params, zval ***parameters TSRMLS_DC)
 {
 	int cur_param = 0,num_of_params = 0;
 	zval **tmp_parameters = NULL;
@@ -3519,7 +3303,7 @@ static void deserialize_parameters(xmlNodePtr params, 
 					MAKE_STD_ZVAL(tmp_parameters[cur_param]);
 					ZVAL_NULL(tmp_parameters[cur_param]);
 				} else {
-					tmp_parameters[cur_param] = master_to_zval((*param)->encode, val);
+					tmp_parameters[cur_param] = master_to_zval((*param)->encode, val TSRMLS_CC);
 				}
 				cur_param++;
 
@@ -3549,7 +3333,7 @@ static void deserialize_parameters(xmlNodePtr params, 
 		    ((sdlSoapBindingFunctionPtr)function->bindingAttributes)->style == SOAP_DOCUMENT &&
 		    (function->requestParameters == NULL ||
 		     zend_hash_num_elements(function->requestParameters) == 0) &&
-		    strcmp(params->name, function->functionName) == 0) {
+		    strcmp((char *)params->name, function->functionName) == 0) {
 			num_of_params = 0;
 		} else if (num_of_params > 0) {
 			tmp_parameters = safe_emalloc(num_of_params, sizeof(zval *), 0);
@@ -3569,7 +3353,7 @@ static void deserialize_parameters(xmlNodePtr params, 
 					} else {
 						enc = (*param)->encode;
 					}
-					tmp_parameters[cur_param] = master_to_zval(enc, trav);
+					tmp_parameters[cur_param] = master_to_zval(enc, trav TSRMLS_CC);
 					cur_param++;
 				}
 				trav = trav->next;
@@ -3577,7 +3361,6 @@ static void deserialize_parameters(xmlNodePtr params, 
 		}
 	}
 	if (num_of_params > cur_param) {
-		TSRMLS_FETCH();
 		soap_server_fault("Client","Missing parameter", NULL, NULL, NULL TSRMLS_CC);
 	}
 	(*parameters) = tmp_parameters;
@@ -3837,7 +3620,7 @@ static sdlFunctionPtr deserialize_function_call(sdlPtr
 				if (h->hdr) {
 					h->num_params = 1;
 					h->parameters = emalloc(sizeof(zval*));
-					h->parameters[0] = master_to_zval(h->hdr->encode, hdr_func);
+					h->parameters[0] = master_to_zval(h->hdr->encode, hdr_func TSRMLS_CC);
 				} else {
 					if (h->function && h->function->binding && h->function->binding->bindingType == BINDING_SOAP) {
 						sdlSoapBindingFunctionPtr fnb = (sdlSoapBindingFunctionPtr)h->function->bindingAttributes;
@@ -3845,7 +3628,7 @@ static sdlFunctionPtr deserialize_function_call(sdlPtr
 							hdr_func = hdr_func->children;
 						}
 					}
-					deserialize_parameters(hdr_func, h->function, &h->num_params, &h->parameters);
+					deserialize_parameters(hdr_func, h->function, &h->num_params, &h->parameters TSRMLS_CC);
 				}
 				INIT_ZVAL(h->retval);
 				if (last == NULL) {
@@ -3868,15 +3651,52 @@ ignore_header:
 	} else {
 		func = func->children;
 	}
-	deserialize_parameters(func, function, num_params, parameters);
+	deserialize_parameters(func, function, num_params, parameters TSRMLS_CC);
 	
 	encode_finish();
 
 	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;
 	sdlParamPtr parameter = NULL;
 	int param_count;
@@ -3975,6 +3795,9 @@ static int serialize_response_call2(xmlNodePtr body, s
 	if (use == SOAP_ENCODED && version == SOAP_1_2 && method != NULL) {
 		xmlSetNsProp(method, body->ns, BAD_CAST("encodingStyle"), BAD_CAST(SOAP_1_2_ENC_NAMESPACE));
 	}
+	if (node) {
+		*node = method;
+	}
 	return use;
 }
 
@@ -4056,11 +3879,11 @@ static xmlDocPtr serialize_response_call(sdlFunctionPt
 			}
 
 			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;
 				}
 			} else {
-				xmlNodePtr xmlHdr = master_to_xml(hdr_enc, hdr_ret, hdr_use, head);
+				xmlNodePtr xmlHdr = master_to_xml(hdr_enc, hdr_ret, hdr_use, head TSRMLS_CC);
 				if (hdr_name) {
 					xmlNodeSetName(xmlHdr, BAD_CAST(hdr_name));
 				}
@@ -4126,7 +3949,7 @@ static xmlDocPtr serialize_response_call(sdlFunctionPt
 
 		if (version == SOAP_1_1) {
 			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"));
 				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);
@@ -4136,22 +3959,22 @@ static xmlDocPtr serialize_response_call(sdlFunctionPt
 					xmlNodeSetContent(node, code);
 					xmlFree(code);
 				} else {	
-					xmlNodeSetContentLen(node, BAD_CAST(str), new_len);
+					xmlNodeSetContentLen(node, BAD_CAST(str), (int)new_len);
 				}
 				efree(str);
 			}
 			if (zend_hash_find(prop, "faultstring", sizeof("faultstring"), (void**)&tmp) == SUCCESS) {
-				xmlNodePtr node = master_to_xml(get_conversion(IS_STRING), *tmp, SOAP_LITERAL, param);
+				xmlNodePtr node = master_to_xml(get_conversion(IS_STRING), *tmp, SOAP_LITERAL, param TSRMLS_CC);
 				xmlNodeSetName(node, BAD_CAST("faultstring"));
 			}
 			if (zend_hash_find(prop, "faultactor", sizeof("faultactor"), (void**)&tmp) == SUCCESS) {
-				xmlNodePtr node = master_to_xml(get_conversion(IS_STRING), *tmp, SOAP_LITERAL, param);
+				xmlNodePtr node = master_to_xml(get_conversion(IS_STRING), *tmp, SOAP_LITERAL, param TSRMLS_CC);
 				xmlNodeSetName(node, BAD_CAST("faultactor"));
 			}
 			detail_name = "detail";
 		} else {
 			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);
 				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);
@@ -4161,13 +3984,13 @@ static xmlDocPtr serialize_response_call(sdlFunctionPt
 					xmlNodeSetContent(node, code);
 					xmlFree(code);
 				} else {	
-					xmlNodeSetContentLen(node, BAD_CAST(str), new_len);
+					xmlNodeSetContentLen(node, BAD_CAST(str), (int)new_len);
 				}
 				efree(str);
 			}
 			if (zend_hash_find(prop, "faultstring", sizeof("faultstring"), (void**)&tmp) == SUCCESS) {
 				xmlNodePtr node = xmlNewChild(param, ns, BAD_CAST("Reason"), NULL);
-				node = master_to_xml(get_conversion(IS_STRING), *tmp, SOAP_LITERAL, node);
+				node = master_to_xml(get_conversion(IS_STRING), *tmp, SOAP_LITERAL, node TSRMLS_CC);
 				xmlNodeSetName(node, BAD_CAST("Text"));
 				xmlSetNs(node, ns);
 			}
@@ -4242,15 +4065,15 @@ static xmlDocPtr serialize_response_call(sdlFunctionPt
 					zval *hdr_ret = &h->retval;
 					char *hdr_ns   = h->hdr?h->hdr->ns:NULL;
 					char *hdr_name = Z_STRVAL(h->function_name);
+					HashTable *ht = NULL;
 
-
 					if (Z_TYPE(h->retval) == IS_OBJECT &&
 					    instanceof_function(Z_OBJCE(h->retval), soap_header_class_entry TSRMLS_CC)) {
-						HashTable* ht = Z_OBJPROP(h->retval);
 						zval **tmp;
 						sdlSoapBindingFunctionHeaderPtr *hdr;
 						smart_str key = {0};
 
+						ht = Z_OBJPROP(h->retval);
 						if (zend_hash_find(ht, "namespace", sizeof("namespace"), (void**)&tmp) == SUCCESS &&
 					      Z_TYPE_PP(tmp) == IS_STRING) {
 							smart_str_appendl(&key, Z_STRVAL_PP(tmp), Z_STRLEN_PP(tmp));
@@ -4281,11 +4104,16 @@ static xmlDocPtr serialize_response_call(sdlFunctionPt
 					}
 
 					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;
 						}
+						if (ht) {
+							set_soap_header_attributes(xmlHdr, ht, version);
+						}
 					} else {
-						xmlNodePtr xmlHdr = master_to_xml(hdr_enc, hdr_ret, hdr_use, head);
+						xmlNodePtr xmlHdr = master_to_xml(hdr_enc, hdr_ret, hdr_use, head TSRMLS_CC);
 						if (hdr_name) {
 							xmlNodeSetName(xmlHdr, BAD_CAST(hdr_name));
 						}
@@ -4293,6 +4121,9 @@ static xmlDocPtr serialize_response_call(sdlFunctionPt
 							xmlNsPtr nsptr = encode_add_ns(xmlHdr,hdr_ns);
 							xmlSetNs(xmlHdr, nsptr);
 						}
+						if (ht) {
+							set_soap_header_attributes(xmlHdr, ht, version);
+						}
 					}
 				}
 				h = h->next;
@@ -4306,7 +4137,7 @@ static xmlDocPtr serialize_response_call(sdlFunctionPt
 
 		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;
 		}
 
@@ -4490,7 +4321,7 @@ static xmlDocPtr serialize_function_call(zval *this_pt
 				}
 
 				if (zend_hash_find(ht, "data", sizeof("data"), (void**)&tmp) == SUCCESS) {
-					h = master_to_xml(enc, *tmp, hdr_use, head);
+					h = master_to_xml(enc, *tmp, hdr_use, head TSRMLS_CC);
 					xmlNodeSetName(h, BAD_CAST(Z_STRVAL_PP(name)));
 				} else {
 					h = xmlNewNode(NULL, BAD_CAST(Z_STRVAL_PP(name)));
@@ -4498,38 +4329,7 @@ static xmlDocPtr serialize_function_call(zval *this_pt
 				}
 				nsptr = encode_add_ns(h, Z_STRVAL_PP(ns));
 				xmlSetNs(h, nsptr);
-
-				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));
-							}
-						}
-					}
-				}
+				set_soap_header_attributes(h, ht, version);
 			}
 			zend_hash_move_forward(soap_headers);
 		}
@@ -4610,7 +4410,7 @@ static xmlNodePtr serialize_zval(zval *val, sdlParamPt
 	} else {
 		enc = NULL;
 	}
-	xmlParam = master_to_xml(enc, val, style, parent);
+	xmlParam = master_to_xml(enc, val, style, parent TSRMLS_CC);
 	if (!strcmp((char*)xmlParam->name, "BOGUS")) {
 		xmlNodeSetName(xmlParam, BAD_CAST(paramName));
 	}