dmitry Tue Nov 16 07:13:41 2004 EDT
Added files: (Branch: PHP_5_0)
/php-src/ext/soap/tests classmap.wsdl classmap001.phpt
classmap002.phpt
Modified files:
/php-src NEWS
/php-src/ext/soap php_encoding.c php_soap.dsp php_soap.h soap.c
Log:
Class mapping was implemented (Bug #29385 Soapserver always uses std class).
http://cvs.php.net/diff.php/php-src/NEWS?r1=1.1760.2.125&r2=1.1760.2.126&ty=u
Index: php-src/NEWS
diff -u php-src/NEWS:1.1760.2.125 php-src/NEWS:1.1760.2.126
--- php-src/NEWS:1.1760.2.125 Mon Nov 15 18:44:13 2004
+++ php-src/NEWS Tue Nov 16 07:13:37 2004
@@ -56,6 +56,7 @@
- Fixed bug #29557 (strtotime error). (Derick)
- Fixed bug #29418 (double free when openssl_csr_new fails).
(Kamesh Jayachandran).
+- Fixed bug #29385 (Soapserver always uses std class). (David, Dmitry)
- Fixed bug #29211 (SoapClient doesn't request wsdl through proxy). (Rob)
- Fixed bug #28599 (strtotime fails with zero base time). (Derick)
- Fixed bug #28220 (mb_strwidth() returns wrong width values for some hangul
http://cvs.php.net/diff.php/php-src/ext/soap/php_encoding.c?r1=1.71.2.8&r2=1.71.2.9&ty=u
Index: php-src/ext/soap/php_encoding.c
diff -u php-src/ext/soap/php_encoding.c:1.71.2.8
php-src/ext/soap/php_encoding.c:1.71.2.9
--- php-src/ext/soap/php_encoding.c:1.71.2.8 Thu Nov 11 04:16:36 2004
+++ php-src/ext/soap/php_encoding.c Tue Nov 16 07:13:40 2004
@@ -17,7 +17,7 @@
| Dmitry Stogov <[EMAIL PROTECTED]> |
+----------------------------------------------------------------------+
*/
-/* $Id: php_encoding.c,v 1.71.2.8 2004/11/11 09:16:36 dmitry Exp $ */
+/* $Id: php_encoding.c,v 1.71.2.9 2004/11/16 12:13:40 dmitry Exp $ */
#include <time.h>
@@ -330,6 +330,7 @@
zval *master_to_zval(encodePtr encode, xmlNodePtr data)
{
+ TSRMLS_FETCH();
data = check_and_resolve_href(data);
if (encode == NULL) {
@@ -359,7 +360,7 @@
}
}
}
- master_to_zval_int(encode, data);
+ return master_to_zval_int(encode, data);
}
#ifdef HAVE_PHP_DOMXML
@@ -954,8 +955,19 @@
xmlNodePtr trav;
sdlPtr sdl;
sdlTypePtr sdlType = type->sdl_type;
+ zend_class_entry *ce = ZEND_STANDARD_CLASS_DEF_PTR;
TSRMLS_FETCH();
+ if (SOAP_GLOBAL(class_map) && type->type_str) {
+ zval **classname;
+ zend_class_entry *tmp;
+
+ if (zend_hash_find(SOAP_GLOBAL(class_map), type->type_str,
strlen(type->type_str)+1, (void**)&classname) == SUCCESS &&
+ Z_TYPE_PP(classname) == IS_STRING &&
+ (tmp = zend_fetch_class(Z_STRVAL_PP(classname),
Z_STRLEN_PP(classname), ZEND_FETCH_CLASS_AUTO TSRMLS_CC)) != NULL) {
+ ce = tmp;
+ }
+ }
sdl = SOAP_GLOBAL(sdl);
if (sdlType) {
if (sdlType->kind == XSD_TYPEKIND_RESTRICTION &&
@@ -974,7 +986,7 @@
MAKE_STD_ZVAL(ret);
- object_init(ret);
+ object_init_ex(ret, ce);
base = master_to_zval_int(enc, data);
#ifdef ZEND_ENGINE_2
base->refcount--;
@@ -983,7 +995,7 @@
} else {
MAKE_STD_ZVAL(ret);
FIND_XML_NULL(data, ret);
- object_init(ret);
+ object_init_ex(ret, ce);
}
} else if (sdlType->kind == XSD_TYPEKIND_EXTENSION &&
sdlType->encode &&
@@ -999,7 +1011,7 @@
MAKE_STD_ZVAL(ret);
- object_init(ret);
+ object_init_ex(ret, ce);
base = master_to_zval_int(sdlType->encode,
data);
#ifdef ZEND_ENGINE_2
base->refcount--;
@@ -1009,7 +1021,7 @@
} else {
MAKE_STD_ZVAL(ret);
FIND_XML_NULL(data, ret);
- object_init(ret);
+ object_init_ex(ret, ce);
}
if (sdlType->model) {
model_to_zval_object(ret, sdlType->model, data, sdl
TSRMLS_CC);
@@ -1055,7 +1067,7 @@
MAKE_STD_ZVAL(ret);
FIND_XML_NULL(data, ret);
- object_init(ret);
+ object_init_ex(ret, ce);
trav = data->children;
@@ -1072,7 +1084,7 @@
#ifdef ZEND_ENGINE_2
tmpVal->refcount--;
#endif
- add_property_zval_ex(ret,
(char*)trav->name, key_len, tmpVal);
+ add_property_zval_ex(ret,
(char*)trav->name, key_len, tmpVal TSRMLS_CC);
} else {
/* Property already exist - make array */
if (Z_TYPE_PP(prop) != IS_ARRAY) {
http://cvs.php.net/diff.php/php-src/ext/soap/php_soap.dsp?r1=1.3&r2=1.3.2.1&ty=u
Index: php-src/ext/soap/php_soap.dsp
diff -u php-src/ext/soap/php_soap.dsp:1.3 php-src/ext/soap/php_soap.dsp:1.3.2.1
--- php-src/ext/soap/php_soap.dsp:1.3 Thu Apr 1 05:47:44 2004
+++ php-src/ext/soap/php_soap.dsp Tue Nov 16 07:13:40 2004
@@ -101,6 +101,10 @@
# End Source File
# Begin Source File
+SOURCE=.\php_packet_soap.c
+# End Source File
+# Begin Source File
+
SOURCE=.\php_schema.c
# End Source File
# Begin Source File
@@ -129,6 +133,10 @@
# End Source File
# Begin Source File
+SOURCE=.\php_packet_soap.h
+# End Source File
+# Begin Source File
+
SOURCE=.\php_schema.h
# End Source File
# Begin Source File
http://cvs.php.net/diff.php/php-src/ext/soap/php_soap.h?r1=1.33.2.1&r2=1.33.2.2&ty=u
Index: php-src/ext/soap/php_soap.h
diff -u php-src/ext/soap/php_soap.h:1.33.2.1
php-src/ext/soap/php_soap.h:1.33.2.2
--- php-src/ext/soap/php_soap.h:1.33.2.1 Tue Aug 10 12:30:30 2004
+++ php-src/ext/soap/php_soap.h Tue Nov 16 07:13:40 2004
@@ -17,7 +17,7 @@
| Dmitry Stogov <[EMAIL PROTECTED]> |
+----------------------------------------------------------------------+
*/
-/* $Id: php_soap.h,v 1.33.2.1 2004/08/10 16:30:30 dmitry Exp $ */
+/* $Id: php_soap.h,v 1.33.2.2 2004/11/16 12:13:40 dmitry Exp $ */
#ifndef PHP_SOAP_H
#define PHP_SOAP_H
@@ -116,6 +116,7 @@
char *actor;
char *uri;
xmlCharEncodingHandlerPtr encoding;
+ HashTable *class_map;
};
#define SOAP_CLASS 1
@@ -160,6 +161,7 @@
char* cache_dir;
long cache_ttl;
xmlCharEncodingHandlerPtr encoding;
+ HashTable *class_map;
ZEND_END_MODULE_GLOBALS(soap)
#ifdef PHP_WIN32
http://cvs.php.net/diff.php/php-src/ext/soap/soap.c?r1=1.110.2.11&r2=1.110.2.12&ty=u
Index: php-src/ext/soap/soap.c
diff -u php-src/ext/soap/soap.c:1.110.2.11 php-src/ext/soap/soap.c:1.110.2.12
--- php-src/ext/soap/soap.c:1.110.2.11 Tue Nov 9 03:13:04 2004
+++ php-src/ext/soap/soap.c Tue Nov 16 07:13:40 2004
@@ -17,7 +17,7 @@
| Dmitry Stogov <[EMAIL PROTECTED]> |
+----------------------------------------------------------------------+
*/
-/* $Id: soap.c,v 1.110.2.11 2004/11/09 08:13:04 dmitry Exp $ */
+/* $Id: soap.c,v 1.110.2.12 2004/11/16 12:13:40 dmitry Exp $ */
#ifdef HAVE_CONFIG_H
#include "config.h"
@@ -441,6 +441,7 @@
SOAP_GLOBAL(sdl) = NULL;
SOAP_GLOBAL(soap_version) = SOAP_1_1;
SOAP_GLOBAL(encoding) = NULL;
+ SOAP_GLOBAL(class_map) = NULL;
return SUCCESS;
}
@@ -866,6 +867,15 @@
}
}
+ if (zend_hash_find(ht, "classmap", sizeof("classmap"),
(void**)&tmp) == SUCCESS &&
+ Z_TYPE_PP(tmp) == IS_ARRAY) {
+ zval *ztmp;
+
+ ALLOC_HASHTABLE(service->class_map);
+ zend_hash_init(service->class_map, 0, NULL,
ZVAL_PTR_DTOR, 0);
+ zend_hash_copy(service->class_map, (*tmp)->value.ht,
(copy_ctor_func_t) zval_add_ref, (void *) &ztmp, sizeof(zval *));
+ }
+
} else if (wsdl == NULL) {
php_error_docref(NULL TSRMLS_CC, E_ERROR, "Invalid arguments.
'uri' option is required in nonWSDL mode.");
}
@@ -1267,6 +1277,7 @@
char *arg = NULL;
int arg_len;
xmlCharEncodingHandlerPtr old_encoding;
+ HashTable *old_class_map;
SOAP_SERVER_BEGIN_CODE();
@@ -1410,6 +1421,8 @@
SOAP_GLOBAL(sdl) = service->sdl;
old_encoding = SOAP_GLOBAL(encoding);
SOAP_GLOBAL(encoding) = service->encoding;
+ old_class_map = SOAP_GLOBAL(class_map);
+ SOAP_GLOBAL(class_map) = service->class_map;
old_soap_version = SOAP_GLOBAL(soap_version);
function = deserialize_function_call(service->sdl, doc_request,
service->actor, &function_name, &num_params, ¶ms, &soap_version,
&soap_headers TSRMLS_CC);
xmlFreeDoc(doc_request);
@@ -1674,6 +1687,7 @@
SOAP_GLOBAL(soap_version) = old_soap_version;
SOAP_GLOBAL(encoding) = old_encoding;
SOAP_GLOBAL(sdl) = old_sdl;
+ SOAP_GLOBAL(class_map) = old_class_map;
/* Free soap headers */
zval_dtor(&retval);
@@ -1986,6 +2000,18 @@
add_property_stringl(this_ptr, "_encoding",
Z_STRVAL_PP(tmp), Z_STRLEN_PP(tmp), 1);
}
}
+ if (zend_hash_find(ht, "classmap", sizeof("classmap"),
(void**)&tmp) == SUCCESS &&
+ Z_TYPE_PP(tmp) == IS_ARRAY) {
+ zval *class_map;
+
+ MAKE_STD_ZVAL(class_map);
+ *class_map = **tmp;
+ zval_copy_ctor(class_map);
+#ifdef ZEND_ENGINE_2
+ class_map->refcount--; /*FIXME*/
+#endif
+ add_property_zval(this_ptr, "_classmap", class_map);
+ }
} else if (wsdl == NULL) {
php_error_docref(NULL TSRMLS_CC, E_ERROR, "'location' and 'uri'
options are requred in nonWSDL mode.");
return;
@@ -2097,6 +2123,7 @@
int soap_version;
zval response;
xmlCharEncodingHandlerPtr old_encoding;
+ HashTable *old_class_map;
SOAP_CLIENT_BEGIN_CODE();
@@ -2128,6 +2155,13 @@
} else {
SOAP_GLOBAL(encoding) = NULL;
}
+ old_class_map = SOAP_GLOBAL(class_map);
+ if (zend_hash_find(Z_OBJPROP_P(this_ptr), "_classmap",
sizeof("_classmap"), (void **) &tmp) == SUCCESS &&
+ Z_TYPE_PP(tmp) == IS_ARRAY) {
+ SOAP_GLOBAL(class_map) = (*tmp)->value.ht;
+ } else {
+ SOAP_GLOBAL(class_map) = NULL;
+ }
if (sdl != NULL) {
fn = get_function(sdl, function);
@@ -2228,6 +2262,7 @@
if (SOAP_GLOBAL(encoding) != NULL) {
xmlCharEncCloseFunc(SOAP_GLOBAL(encoding));
}
+ SOAP_GLOBAL(class_map) = old_class_map;
SOAP_GLOBAL(encoding) = old_encoding;
SOAP_GLOBAL(sdl) = old_sdl;
SOAP_CLIENT_END_CODE();
@@ -3980,5 +4015,9 @@
if (service->encoding) {
xmlCharEncCloseFunc(service->encoding);
}
+ if (service->class_map) {
+ zend_hash_destroy(service->class_map);
+ FREE_HASHTABLE(service->class_map);
+ }
efree(service);
}
http://cvs.php.net/co.php/php-src/ext/soap/tests/classmap.wsdl?r=1.1&p=1
Index: php-src/ext/soap/tests/classmap.wsdl
+++ php-src/ext/soap/tests/classmap.wsdl
<wsdl:definitions xmlns="http://schemas.xmlsoap.org/wsdl/"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:tns="http://schemas.nothing.com"
targetNamespace="http://schemas.nothing.com">
<wsdl:types>
<xsd:schema targetNamespace="http://schemas.nothing.com">
<xsd:complexType name="book">
<xsd:all>
<xsd:element name="a"
type="xsd:string"/>
<xsd:element name="b"
type="xsd:string"/>
</xsd:all>
</xsd:complexType>
</xsd:schema>
</wsdl:types>
<message name="dotestRequest">
<part name="dotestReturn" type="tns:book"/>
</message>
<message name="dotestResponse">
<part name="res" type="xsi:string"/>
</message>
<message name="dotest2Request">
<part name="dotest2" type="xsi:string"/>
</message>
<message name="dotest2Response">
<part name="res" type="tns:book"/>
</message>
<portType name="testPortType">
<operation name="dotest">
<input message="tns:dotestRequest"/>
<output message="tns:dotestResponse"/>
</operation>
<operation name="dotest2">
<input message="tns:dotest2Request"/>
<output message="tns:dotest2Response"/>
</operation>
</portType>
<binding name="testBinding" type="tns:testPortType">
<soap:binding style="rpc"
transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="dotest">
<soap:operation
soapAction="http://localhost:81/test/interface.php?class=test/dotest"
style="rpc"/>
<input>
<soap:body use="encoded"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
namespace="http://schemas.nabek.com"/>
</input>
<output>
<soap:body use="encoded"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
namespace="http://schemas.nabek.com"/>
</output>
</operation>
<operation name="dotest2">
<soap:operation
soapAction="http://localhost:81/test/interface.php?class=test/dotest2"
style="rpc"/>
<input>
<soap:body use="encoded"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
namespace="http://schemas.nabek.com"/>
</input>
<output>
<soap:body use="encoded"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
namespace="http://schemas.nabek.com"/>
</output>
</operation>
</binding>
<service name="test">
<port name="testPort" binding="tns:testBinding">
<soap:address
location="http://localhost:81/test/interface.php?class=test"/>
</port>
</service>
</wsdl:definitions>
http://cvs.php.net/co.php/php-src/ext/soap/tests/classmap001.phpt?r=1.1&p=1
Index: php-src/ext/soap/tests/classmap001.phpt
+++ php-src/ext/soap/tests/classmap001.phpt
--TEST--
SOAP Classmap 1: SoapServer support for classmap
--SKIPIF--
<?php require_once('skipif.inc'); ?>
--FILE--
<?php
$GLOBALS['HTTP_RAW_POST_DATA']="
<env:Envelope xmlns:env=\"http://schemas.xmlsoap.org/soap/envelope/\"
xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"
xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"
xmlns:enc=\"http://schemas.xmlsoap.org/soap/encoding/\"
xmlns:ns1=\"http://schemas.nothing.com\"
>
<env:Body>
<dotest>
<book xsi:type=\"ns1:book\">
<a xsi:type=\"xsd:string\">Blaat</a>
<b xsi:type=\"xsd:string\">aap</b>
</book>
</dotest>
</env:Body>
<env:Header/>
</env:Envelope>";
class test{
function dotest(book $book){
$classname=get_class($book);
return "Classname: ".$classname;
}
}
class book{
public $a="a";
public $b="c";
}
$options=Array(
'actor' =>'http://schema.nothing.com',
'classmap' => array('book'=>'book', 'wsdltype2'=>'classname2')
);
$server = new SoapServer(dirname(__FILE__)."/classmap.wsdl",$options);
$server->setClass("test");
$server->handle();
echo "ok\n";
?>
--EXPECT--
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:ns1="http://schemas.nabek.com"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><SOAP-ENV:Body><ns1:dotestResponse><res
xsi:type="xsd:string">Classname:
book</res></ns1:dotestResponse></SOAP-ENV:Body></SOAP-ENV:Envelope>
ok
http://cvs.php.net/co.php/php-src/ext/soap/tests/classmap002.phpt?r=1.1&p=1
Index: php-src/ext/soap/tests/classmap002.phpt
+++ php-src/ext/soap/tests/classmap002.phpt
--TEST--
SOAP Classmap 2: SoapClient support for classmap
--SKIPIF--
<?php require_once('skipif.inc'); ?>
--FILE--
<?php
class TestSoapClient extends SoapClient{
function __doRequest($request, $location, $action, $version) {
return <<<EOF
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:ns1="http://schemas.nabek.com"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><SOAP-ENV:Body>
<ns1:dotest2Response><res xsi:type="ns1:book">
<a xsi:type="xsd:string">Blaat</a>
<b xsi:type="xsd:string">aap</b>
</res>
</ns1:dotest2Response></SOAP-ENV:Body></SOAP-ENV:Envelope>
EOF;
}
}
class book{
public $a="a";
public $b="c";
}
$options=Array(
'actor' =>'http://schema.nothing.com',
'classmap' => array('book'=>'book', 'wsdltype2'=>'classname2')
);
$client = new TestSoapClient(dirname(__FILE__)."/classmap.wsdl",$options);
$ret = $client->dotest2("???");
var_dump($ret);
echo "ok\n";
?>
--EXPECT--
object(book)#2 (2) {
["a"]=>
string(5) "Blaat"
["b"]=>
string(3) "aap"
}
ok
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php