From 7e34938f93665841d2c93ffa7c61f241ae02ab33 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Tue, 20 Mar 2007 07:51:47 +0000 Subject: [PATCH] Fixed bug #36226 (Inconsistent handling when passing nillable arrays) --- ext/soap/php_encoding.c | 3 +- ext/soap/tests/bugs/bug36226-2.phpt | 151 ++++++++ ext/soap/tests/bugs/bug36226-2.wsdl | 543 ++++++++++++++++++++++++++++ 3 files changed, 696 insertions(+), 1 deletion(-) create mode 100755 ext/soap/tests/bugs/bug36226-2.phpt create mode 100755 ext/soap/tests/bugs/bug36226-2.wsdl diff --git a/ext/soap/php_encoding.c b/ext/soap/php_encoding.c index f7d4084f05..6e4b16ac7c 100644 --- a/ext/soap/php_encoding.c +++ b/ext/soap/php_encoding.c @@ -1187,7 +1187,8 @@ static void model_to_zval_object(zval *ret, sdlContentModelPtr model, xmlNodePtr add_next_index_zval(array, val); } while ((node = get_node(node->next, model->u.element->name)) != NULL); val = array; - } else if ((SOAP_GLOBAL(features) & SOAP_SINGLE_ELEMENT_ARRAYS) && + } else if ((Z_TYPE_P(val) != IS_NULL || !model->u.element->nillable) && + (SOAP_GLOBAL(features) & SOAP_SINGLE_ELEMENT_ARRAYS) && (model->max_occurs == -1 || model->max_occurs > 1)) { zval *array; diff --git a/ext/soap/tests/bugs/bug36226-2.phpt b/ext/soap/tests/bugs/bug36226-2.phpt new file mode 100755 index 0000000000..8605f21a72 --- /dev/null +++ b/ext/soap/tests/bugs/bug36226-2.phpt @@ -0,0 +1,151 @@ +--TEST-- +Bug #36226 (Inconsistent handling when passing nillable arrays) +--INI-- +soap.wsdl_cache_enabled=0 +--FILE-- +server = new SoapServer($wsdl, $options); + $this->server->addFunction('PostEvents'); + } + + function __doRequest($request, $location, $action, $version) { + echo "$request\n"; + $this->server->handle($request); + return $response; + } +} + +$soapClient = new TestSoapClient($wsdl, + array( + 'trace' => 1, + 'exceptions' => 0, + 'classmap' => array( + 'logOnEvent' => 'LogOnEvent', + 'logOffEvent' => 'LogOffEvent', + 'events' => 'IVREvents' + ), + 'features' => SOAP_SINGLE_ELEMENT_ARRAYS + )); + +$logOnEvent = null; +//$logOnEvent = array(); +$logOffEvents[] = new LogOffEvent(34567, $timestamp, "Smoked"); +//$logOffEvents[] = new LogOffEvent(34568, $timestamp, "SmokeFree"); +$ivrEvents = new IVREvents("1.0", 101, 12345, 'IVR', $logOnEvent, $logOffEvents); +$result = $soapClient->PostEvents($ivrEvents); + +class LogOffEvent { + public $audienceMemberId; + public $timestamp; + public $smokeStatus; + public $callInitiator; + + function __construct($audienceMemberId, $timestamp, $smokeStatus) { + $this->audienceMemberId = $audienceMemberId; + $this->timestamp = $timestamp; + $this->smokeStatus = $smokeStatus; + $this->callInitiator = "IVR"; + } +} + +class LogOnEvent { + public $audienceMemberId; + public $timestamp; + + function __construct($audienceMemberId, $timestamp) { + $this->audienceMemberId = $audienceMemberId; + $this->timestamp = $timestamp; + } +} + +class IVREvents { + public $version; + public $activityId; + public $messageId; + public $source; + public $logOnEvent; + public $logOffEvent; + + function __construct($version, $activityId, $messageId, $source, $logOnEvent=NULL, $logOffEvent=NULL) { + $this->version = $version; + $this->activityId = $activityId; + $this->messageId = $messageId; + $this->source = $source; + $this->logOnEvent = $logOnEvent; + $this->logOffEvent = $logOffEvent; + } + +} +?> +--EXPECT-- + + + +object(IVREvents)#5 (6) { + ["version"]=> + string(3) "1.0" + ["activityId"]=> + int(101) + ["messageId"]=> + int(12345) + ["source"]=> + string(3) "IVR" + ["logOnEvent"]=> + NULL + ["logOffEvent"]=> + array(1) { + [0]=> + object(LogOffEvent)#6 (4) { + ["audienceMemberId"]=> + int(34567) + ["timestamp"]=> + string(25) "2005-11-08T11:22:07+03:00" + ["smokeStatus"]=> + string(6) "Smoked" + ["callInitiator"]=> + string(3) "IVR" + } + } +} +--UEXPECT-- + + + +object(IVREvents)#5 (6) { + [u"version"]=> + unicode(3) "1.0" + [u"activityId"]=> + int(101) + [u"messageId"]=> + int(12345) + [u"source"]=> + unicode(3) "IVR" + [u"logOnEvent"]=> + NULL + [u"logOffEvent"]=> + array(1) { + [0]=> + object(LogOffEvent)#6 (4) { + [u"audienceMemberId"]=> + int(34567) + [u"timestamp"]=> + unicode(25) "2005-11-08T11:22:07+03:00" + [u"smokeStatus"]=> + unicode(6) "Smoked" + [u"callInitiator"]=> + unicode(3) "IVR" + } + } +} diff --git a/ext/soap/tests/bugs/bug36226-2.wsdl b/ext/soap/tests/bugs/bug36226-2.wsdl new file mode 100755 index 0000000000..18c2ce3c00 --- /dev/null +++ b/ext/soap/tests/bugs/bug36226-2.wsdl @@ -0,0 +1,543 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -- 2.40.0