dmitry Tue Mar 22 05:18:49 2005 EDT
Added files: (Branch: PHP_5_0)
/php-src/ext/soap/tests/bugs bug30106.phpt bug30106.wsdl
Modified files:
/php-src NEWS
/php-src/ext/soap php_encoding.c php_encoding.h php_packet_soap.c
php_schema.c php_sdl.h soap.c
Log:
Fixed bug #30106 (SOAP cannot not parse 'ref' element. Causes Uncaught
SoapFault exception)
http://cvs.php.net/diff.php/php-src/NEWS?r1=1.1760.2.295&r2=1.1760.2.296&ty=u
Index: php-src/NEWS
diff -u php-src/NEWS:1.1760.2.295 php-src/NEWS:1.1760.2.296
--- php-src/NEWS:1.1760.2.295 Mon Mar 21 15:13:52 2005
+++ php-src/NEWS Tue Mar 22 05:18:42 2005
@@ -147,6 +147,8 @@
- Fixed bug #30266 (Invalid opcode 137/1/8). (Marcus)
- Fixed bug #30120 (imagettftext() and imagettfbbox() accept too many
parameters). (Jani)
+- Fixed bug #30106 (SOAP cannot not parse 'ref' element. Causes Uncaught
+ SoapFault exception). (Dmitry)
- Fixed bug #29989 (type re_registers redefined in oniguruma.h). (Moriyoshi)
- Fixed bug #29767 (Weird behaviour of __set($name, $value)). (Dmitry)
- Fixed bug #29733 (printf() handles repeated placeholders wrong).
http://cvs.php.net/diff.php/php-src/ext/soap/php_encoding.c?r1=1.71.2.13&r2=1.71.2.14&ty=u
Index: php-src/ext/soap/php_encoding.c
diff -u php-src/ext/soap/php_encoding.c:1.71.2.13
php-src/ext/soap/php_encoding.c:1.71.2.14
--- php-src/ext/soap/php_encoding.c:1.71.2.13 Sat Mar 5 08:26:56 2005
+++ php-src/ext/soap/php_encoding.c Tue Mar 22 05:18:47 2005
@@ -17,7 +17,7 @@
| Dmitry Stogov <[EMAIL PROTECTED]> |
+----------------------------------------------------------------------+
*/
-/* $Id: php_encoding.c,v 1.71.2.13 2005/03/05 13:26:56 dmitry Exp $ */
+/* $Id: php_encoding.c,v 1.71.2.14 2005/03/22 10:18:47 dmitry Exp $ */
#include <time.h>
@@ -72,6 +72,9 @@
static xmlNodePtr to_xml_object(encodeTypePtr type, zval *data, int style,
xmlNodePtr parent);
static xmlNodePtr to_xml_array(encodeTypePtr type, zval *data, int style,
xmlNodePtr parent);
+static zval *to_zval_any(encodeTypePtr type, xmlNodePtr data);
+static xmlNodePtr to_xml_any(encodeTypePtr type, zval *data, int style,
xmlNodePtr parent);
+
/* Try and guess for non-wsdl clients and servers */
static zval *guess_zval_convert(encodeTypePtr type, xmlNodePtr data);
static xmlNodePtr guess_xml_convert(encodeTypePtr type, zval *data, int style,
xmlNodePtr parent);
@@ -81,8 +84,6 @@
static xmlNodePtr check_and_resolve_href(xmlNodePtr data);
-static encodePtr get_conversion(int encode);
-
static void get_type_str(xmlNodePtr node, const char* ns, const char* type,
smart_str* ret);
static void set_ns_and_type_ex(xmlNodePtr node, char *ns, char *type);
@@ -201,6 +202,8 @@
{{XSD_BYTE, XSD_BYTE_STRING, XSD_1999_NAMESPACE, NULL}, to_zval_long,
to_xml_long},
{{XSD_1999_TIMEINSTANT, XSD_1999_TIMEINSTANT_STRING,
XSD_1999_NAMESPACE, NULL}, to_zval_stringc, to_xml_string},
+ {{XSD_ANYXML, "<anyXML>", "<anyXML>", NULL}, to_zval_any, to_xml_any},
+
{{END_KNOWN_TYPES, NULL, NULL, NULL}, guess_zval_convert,
guess_xml_convert}
};
@@ -963,17 +966,58 @@
}
}
break;
- case XSD_CONTENT_SEQUENCE:
case XSD_CONTENT_ALL:
+ case XSD_CONTENT_SEQUENCE:
case XSD_CONTENT_CHOICE: {
sdlContentModelPtr *tmp;
HashPosition pos;
+ sdlContentModelPtr any = NULL;
zend_hash_internal_pointer_reset_ex(model->u.content,
&pos);
while (zend_hash_get_current_data_ex(model->u.content,
(void**)&tmp, &pos) == SUCCESS) {
- model_to_zval_object(ret, *tmp, data, sdl
TSRMLS_CC);
+ if ((*tmp)->kind == XSD_CONTENT_ANY) {
+ any = *tmp;
+ } else {
+ model_to_zval_object(ret, *tmp, data,
sdl TSRMLS_CC);
+ }
zend_hash_move_forward_ex(model->u.content,
&pos);
}
+ if (any) {
+ xmlNodePtr node = data->children;
+ zval* any = NULL;
+
+ while (node != NULL) {
+ if (get_zval_property(ret,
(char*)node->name TSRMLS_CC) == NULL) {
+ zval* val =
master_to_zval(get_conversion(XSD_ANYXML), node);
+ while (node->next != NULL &&
+ get_zval_property(ret,
(char*)node->next->name TSRMLS_CC) == NULL) {
+ zval* val2 =
master_to_zval(get_conversion(XSD_ANYXML), node->next);
+
add_string_to_string(val, val, val2);
+ zval_ptr_dtor(&val2);
+ node = node->next;
+ }
+ if (any == NULL) {
+ any = val;
+ } else {
+ if (Z_TYPE_P(any) !=
IS_ARRAY) {
+ /* Convert into array */
+ zval *arr;
+
+ MAKE_STD_ZVAL(arr);
+ array_init(arr);
+
add_next_index_zval(arr, any);
+ any = arr;
+ }
+ /* Add array element */
+ add_next_index_zval(any, val);
+ }
+ }
+ node = node->next;
+ }
+ if (any) {
+ set_zval_property(ret, "any", any
TSRMLS_CC);
+ }
+ }
break;
}
case XSD_CONTENT_GROUP:
@@ -1205,6 +1249,37 @@
}
break;
}
+ case XSD_CONTENT_ANY: {
+ zval *data;
+ xmlNodePtr property;
+ encodePtr enc;
+
+ data = get_zval_property(object, "any" TSRMLS_CC);
+ if (data) {
+ enc = get_conversion(XSD_ANYXML);
+ if ((model->max_occurs == -1 ||
model->max_occurs > 1) && Z_TYPE_P(data) == IS_ARRAY) {
+ HashTable *ht = Z_ARRVAL_P(data);
+ zval **val;
+
+ zend_hash_internal_pointer_reset(ht);
+ while
(zend_hash_get_current_data(ht,(void**)&val) == SUCCESS) {
+ property = master_to_xml(enc,
*val, style, node);
+ zend_hash_move_forward(ht);
+ }
+ } else {
+ property = master_to_xml(enc, data,
style, node);
+ }
+ return 1;
+ } else if (model->min_occurs == 0) {
+ return 2;
+ } else {
+ if (strict) {
+ soap_error0(E_ERROR, "Encoding: object
hasn't 'any' property");
+ }
+ return 0;
+ }
+ break;
+ }
case XSD_CONTENT_SEQUENCE:
case XSD_CONTENT_ALL: {
sdlContentModelPtr *tmp;
@@ -2492,6 +2567,41 @@
return to_xml_list(enc,data,style, parent);
}
+static zval *to_zval_any(encodeTypePtr type, xmlNodePtr data)
+{
+ xmlBufferPtr buf;
+ zval *ret;
+
+ buf = xmlBufferCreate();
+ xmlNodeDump(buf, NULL, data, 0, 0);
+ MAKE_STD_ZVAL(ret);
+ ZVAL_STRING(ret, (char*)xmlBufferContent(buf), 1);
+ xmlBufferFree(buf);
+ return ret;
+}
+
+extern const xmlChar xmlStringTextNoenc[];
+
+static xmlNodePtr to_xml_any(encodeTypePtr type, zval *data, int style,
xmlNodePtr parent)
+{
+ xmlNodePtr ret;
+
+ if (Z_TYPE_P(data) == IS_STRING) {
+ ret = xmlNewTextLen(Z_STRVAL_P(data), Z_STRLEN_P(data));
+ } else {
+ zval tmp = *data;
+
+ zval_copy_ctor(&tmp);
+ convert_to_string(&tmp);
+ ret = xmlNewTextLen(Z_STRVAL_P(data), Z_STRLEN_P(data));
+ zval_dtor(&tmp);
+ }
+ ret->name = xmlStringTextNoenc;
+ xmlAddChild(parent, ret);
+
+ return ret;
+}
+
zval *sdl_guess_convert_zval(encodeTypePtr enc, xmlNodePtr data)
{
sdlTypePtr type;
@@ -2723,7 +2833,7 @@
SOAP_GLOBAL(cur_uniq_ns) = 0;
}
-static encodePtr get_conversion(int encode)
+encodePtr get_conversion(int encode)
{
encodePtr *enc = NULL;
TSRMLS_FETCH();
http://cvs.php.net/diff.php/php-src/ext/soap/php_encoding.h?r1=1.35.2.1&r2=1.35.2.2&ty=u
Index: php-src/ext/soap/php_encoding.h
diff -u php-src/ext/soap/php_encoding.h:1.35.2.1
php-src/ext/soap/php_encoding.h:1.35.2.2
--- php-src/ext/soap/php_encoding.h:1.35.2.1 Thu Aug 26 14:36:46 2004
+++ php-src/ext/soap/php_encoding.h Tue Mar 22 05:18:47 2005
@@ -17,7 +17,7 @@
| Dmitry Stogov <[EMAIL PROTECTED]> |
+----------------------------------------------------------------------+
*/
-/* $Id: php_encoding.h,v 1.35.2.1 2004/08/26 18:36:46 dmitry Exp $ */
+/* $Id: php_encoding.h,v 1.35.2.2 2005/03/22 10:18:47 dmitry Exp $ */
#ifndef PHP_ENCODING_H
#define PHP_ENCODING_H
@@ -139,6 +139,8 @@
#define XSD_UR_TYPE 146
#define XSD_UR_TYPE_STRING "ur-type"
+#define XSD_ANYXML 147
+
#define APACHE_NAMESPACE "http://xml.apache.org/xml-soap"
#define APACHE_MAP 200
#define APACHE_MAP_STRING "Map"
@@ -214,6 +216,8 @@
void encode_reset_ns();
xmlNsPtr encode_add_ns(xmlNodePtr node, const char* ns);
+encodePtr get_conversion(int encode);
+
void delete_encoder(void *handle);
extern encode defaultEncoding[];
http://cvs.php.net/diff.php/php-src/ext/soap/php_packet_soap.c?r1=1.36.2.3&r2=1.36.2.4&ty=u
Index: php-src/ext/soap/php_packet_soap.c
diff -u php-src/ext/soap/php_packet_soap.c:1.36.2.3
php-src/ext/soap/php_packet_soap.c:1.36.2.4
--- php-src/ext/soap/php_packet_soap.c:1.36.2.3 Tue Oct 5 11:58:28 2004
+++ php-src/ext/soap/php_packet_soap.c Tue Mar 22 05:18:47 2005
@@ -17,7 +17,7 @@
| Dmitry Stogov <[EMAIL PROTECTED]> |
+----------------------------------------------------------------------+
*/
-/* $Id: php_packet_soap.c,v 1.36.2.3 2004/10/05 15:58:28 dmitry Exp $ */
+/* $Id: php_packet_soap.c,v 1.36.2.4 2005/03/22 10:18:47 dmitry Exp $ */
#include "php_soap.h"
@@ -222,6 +222,11 @@
}
}
add_soap_fault(this_ptr, faultcode, faultstring, faultactor,
details TSRMLS_CC);
+#ifdef ZEND_ENGINE_2
+ if (details) {
+ details->refcount--;
+ }
+#endif
xmlFreeDoc(response);
return FALSE;
}
http://cvs.php.net/diff.php/php-src/ext/soap/php_schema.c?r1=1.49.2.2&r2=1.49.2.3&ty=u
Index: php-src/ext/soap/php_schema.c
diff -u php-src/ext/soap/php_schema.c:1.49.2.2
php-src/ext/soap/php_schema.c:1.49.2.3
--- php-src/ext/soap/php_schema.c:1.49.2.2 Fri Mar 18 13:31:25 2005
+++ php-src/ext/soap/php_schema.c Tue Mar 22 05:18:47 2005
@@ -17,7 +17,7 @@
| Dmitry Stogov <[EMAIL PROTECTED]> |
+----------------------------------------------------------------------+
*/
-/* $Id: php_schema.c,v 1.49.2.2 2005/03/18 18:31:25 dmitry Exp $ */
+/* $Id: php_schema.c,v 1.49.2.3 2005/03/22 10:18:47 dmitry Exp $ */
#include "php_soap.h"
#include "libxml/uri.h"
@@ -1301,9 +1301,44 @@
return TRUE;
}
-static int schema_any(sdlPtr sdl, xmlAttrPtr tns, xmlNodePtr extType,
sdlTypePtr cur_type, sdlContentModelPtr model)
+/*
+<any
+ id = ID
+ maxOccurs = (nonNegativeInteger | unbounded) : 1
+ minOccurs = nonNegativeInteger : 1
+ namespace = ((##any | ##other) | List of (anyURI | (##targetNamespace |
##local)) ) : ##any
+ processContents = (lax | skip | strict) : strict
+ {any attributes with non-schema namespace . . .}>
+ Content: (annotation?)
+</any>
+*/
+static int schema_any(sdlPtr sdl, xmlAttrPtr tns, xmlNodePtr anyType,
sdlTypePtr cur_type, sdlContentModelPtr model)
{
- /* TODO: <any> support */
+ if (model != NULL) {
+ sdlContentModelPtr newModel;
+ xmlAttrPtr attr;
+
+ newModel = emalloc(sizeof(sdlContentModel));
+ newModel->kind = XSD_CONTENT_ANY;
+ newModel->min_occurs = 1;
+ newModel->max_occurs = 1;
+
+ attr = get_attribute(anyType->properties, "minOccurs");
+ if (attr) {
+ newModel->min_occurs = atoi(attr->children->content);
+ }
+
+ attr = get_attribute(anyType->properties, "maxOccurs");
+ if (attr) {
+ if (!strncmp(attr->children->content, "unbounded",
sizeof("unbounded"))) {
+ newModel->max_occurs = -1;
+ } else {
+ newModel->max_occurs =
atoi(attr->children->content);
+ }
+ }
+
+ zend_hash_next_index_insert(model->u.content, &newModel,
sizeof(sdlContentModelPtr), NULL);
+ }
return TRUE;
}
@@ -2157,6 +2192,8 @@
if ((*tmp)->def) {
type->def = estrdup((*tmp)->def);
}
+ } else if (strcmp(type->ref, SCHEMA_NAMESPACE
":schema") == 0) {
+ type->encode = get_conversion(XSD_ANYXML);
} else {
soap_error0(E_ERROR, "Parsing Schema:
unresolved element 'ref' attribute");
}
@@ -2258,6 +2295,8 @@
case XSD_CONTENT_GROUP_REF:
efree(tmp->u.group_ref);
break;
+ default:
+ break;
}
efree(tmp);
}
http://cvs.php.net/diff.php/php-src/ext/soap/php_sdl.h?r1=1.31.2.3&r2=1.31.2.4&ty=u
Index: php-src/ext/soap/php_sdl.h
diff -u php-src/ext/soap/php_sdl.h:1.31.2.3 php-src/ext/soap/php_sdl.h:1.31.2.4
--- php-src/ext/soap/php_sdl.h:1.31.2.3 Mon Mar 21 10:57:16 2005
+++ php-src/ext/soap/php_sdl.h Tue Mar 22 05:18:48 2005
@@ -17,7 +17,7 @@
| Dmitry Stogov <[EMAIL PROTECTED]> |
+----------------------------------------------------------------------+
*/
-/* $Id: php_sdl.h,v 1.31.2.3 2005/03/21 15:57:16 dmitry Exp $ */
+/* $Id: php_sdl.h,v 1.31.2.4 2005/03/22 10:18:48 dmitry Exp $ */
#ifndef PHP_SDL_H
#define PHP_SDL_H
@@ -152,7 +152,8 @@
XSD_CONTENT_ALL,
XSD_CONTENT_CHOICE,
XSD_CONTENT_GROUP_REF,
- XSD_CONTENT_GROUP
+ XSD_CONTENT_GROUP,
+ XSD_CONTENT_ANY
} sdlContentKind;
http://cvs.php.net/diff.php/php-src/ext/soap/soap.c?r1=1.110.2.26&r2=1.110.2.27&ty=u
Index: php-src/ext/soap/soap.c
diff -u php-src/ext/soap/soap.c:1.110.2.26 php-src/ext/soap/soap.c:1.110.2.27
--- php-src/ext/soap/soap.c:1.110.2.26 Sun Mar 20 04:55:33 2005
+++ php-src/ext/soap/soap.c Tue Mar 22 05:18:48 2005
@@ -17,7 +17,7 @@
| Dmitry Stogov <[EMAIL PROTECTED]> |
+----------------------------------------------------------------------+
*/
-/* $Id: soap.c,v 1.110.2.26 2005/03/20 09:55:33 dmitry Exp $ */
+/* $Id: soap.c,v 1.110.2.27 2005/03/22 10:18:48 dmitry Exp $ */
#ifdef HAVE_CONFIG_H
#include "config.h"
@@ -3946,11 +3946,19 @@
static void model_to_string(sdlContentModelPtr model, smart_str *buf, int
level)
{
+ int i;
+
switch (model->kind) {
case XSD_CONTENT_ELEMENT:
type_to_string(model->u.element, buf, level);
smart_str_appendl(buf, ";\n", 2);
break;
+ case XSD_CONTENT_ANY:
+ for (i = 0;i < level;i++) {
+ smart_str_appendc(buf, ' ');
+ }
+ smart_str_appendl(buf, "<anyXML> any;\n",
sizeof("<anyXML> any;\n")-1);
+ break;
case XSD_CONTENT_SEQUENCE:
case XSD_CONTENT_ALL:
case XSD_CONTENT_CHOICE: {
http://cvs.php.net/co.php/php-src/ext/soap/tests/bugs/bug30106.phpt?r=1.1&p=1
Index: php-src/ext/soap/tests/bugs/bug30106.phpt
+++ php-src/ext/soap/tests/bugs/bug30106.phpt
http://cvs.php.net/co.php/php-src/ext/soap/tests/bugs/bug30106.wsdl?r=1.1&p=1
Index: php-src/ext/soap/tests/bugs/bug30106.wsdl
+++ php-src/ext/soap/tests/bugs/bug30106.wsdl
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php