]> granicus.if.org Git - php/commitdiff
Support for <soap:body> "parts" attribute
authorDmitry Stogov <dmitry@php.net>
Mon, 21 Mar 2005 15:52:53 +0000 (15:52 +0000)
committerDmitry Stogov <dmitry@php.net>
Mon, 21 Mar 2005 15:52:53 +0000 (15:52 +0000)
ext/soap/php_sdl.c
ext/soap/php_sdl.h
ext/soap/tests/bugs/bug30928.wsdl
ext/soap/tests/schema/test_schema.inc

index 9b526110e8ccc9c355e3062b3dda9fd45ca34064..731a3be8b338f6aa0c4c21752f7f83c1bc6c6f4a 100644 (file)
@@ -480,8 +480,43 @@ static void wsdl_soap_binding_body(sdlCtx* ctx, xmlNodePtr node, char* wsdl_soap
 
                        tmp = get_attribute(body->properties, "parts");
                        if (tmp) {
-                               whiteSpace_collapse(tmp->children->content);
-                               binding->parts = estrdup(tmp->children->content);
+                               HashTable    ht;
+                               char *parts = tmp->children->content;
+
+                               /* Delete all parts those are not in the "parts" attribute */
+                               zend_hash_init(&ht, 0, NULL, delete_parameter, 0);
+                               while (*parts) {
+                                       HashPosition pos;
+                                       sdlParamPtr *param;
+                                       int found = 0;
+                                       char *end;
+
+                                       while (*parts == ' ') ++parts;
+                                       if (*parts == '\0') break;
+                                       end = strchr(parts, ' ');
+                                       if (end) *end = '\0';
+                                       zend_hash_internal_pointer_reset_ex(params, &pos);
+                                       while (zend_hash_get_current_data_ex(params, (void **)&param, &pos) != FAILURE) {
+                                               if ((*param)->paramName &&
+                                                   strcmp(parts, (*param)->paramName) == 0) {
+                                               sdlParamPtr x_param;
+                                               x_param = emalloc(sizeof(sdlParam));
+                                               *x_param = **param;
+                                               (*param)->paramName = NULL;
+                                               zend_hash_next_index_insert(&ht, &x_param, sizeof(sdlParamPtr), NULL);
+                                               found = 1;
+                                               break;
+                                               }
+                                               zend_hash_move_forward_ex(params, &pos);
+                                       }
+                                       if (!found) {
+                                               soap_error1(E_ERROR, "Parsing WSDL: Missing part '%s' in <message>", parts);
+                                       }
+                                       parts += strlen(parts);
+                                       if (end) *end = ' ';
+                               }
+                               zend_hash_destroy(params);
+                               *params = ht;
                        }
 
                        if (binding->use == SOAP_ENCODED) {
@@ -1026,7 +1061,7 @@ static sdlPtr load_wsdl(zval *this_ptr, char *struri TSRMLS_DC)
        return ctx.sdl;
 }
 
-#define WSDL_CACHE_VERSION 0x0a
+#define WSDL_CACHE_VERSION 0x0b
 
 #define WSDL_CACHE_GET(ret,type,buf)   memcpy(&ret,*buf,sizeof(type)); *buf += sizeof(type);
 #define WSDL_CACHE_GET_INT(ret,buf)    ret = ((unsigned char)(*buf)[0])|((unsigned char)(*buf)[1]<<8)|((unsigned char)(*buf)[2]<<16)|((int)(*buf)[3]<<24); *buf += 4;
@@ -1274,7 +1309,6 @@ static void sdl_deserialize_soap_body(sdlSoapBindingFunctionBodyPtr body, encode
                body->encodingStyle = SOAP_ENCODING_DEFAULT;
        }
        body->ns = sdl_deserialize_string(in);
-       body->parts = sdl_deserialize_string(in);
        WSDL_CACHE_GET_INT(i, in);
        if (i > 0) {
                body->headers = emalloc(sizeof(HashTable));
@@ -1875,7 +1909,6 @@ static void sdl_serialize_soap_body(sdlSoapBindingFunctionBodyPtr body, HashTabl
                WSDL_CACHE_PUT_1(body->encodingStyle, out);
        }
        sdl_serialize_string(body->ns, out);
-       sdl_serialize_string(body->parts, out);
        if (body->headers) {
                i = zend_hash_num_elements(body->headers);
        } else {
@@ -2310,9 +2343,6 @@ static void delete_sdl_soap_binding_function_body(sdlSoapBindingFunctionBody bod
        if (body.ns) {
                efree(body.ns);
        }
-       if (body.parts) {
-               efree(body.parts);
-       }
        if (body.headers) {
                zend_hash_destroy(body.headers);
                efree(body.headers);
index e2c4542604177f5315dd859b4db63e5190f73070..5d25adc231657c0cce5a79c1f60bea1bcfb95d47 100644 (file)
@@ -109,7 +109,6 @@ typedef struct _sdlSoapBindingFunctionFault {
 struct _sdlSoapBindingFunctionBody {
        char                *ns;
        sdlEncodingUse       use;
-       char                *parts;          /* not implemented yet */
        sdlRpcEncodingStyle  encodingStyle;  /* not implemented yet */
        HashTable           *headers;        /* array of sdlSoapBindingFunctionHeaderPtr */
 };
index 9814883ed5f108ba4cf3dec9692afa39ef10416f..7ed34d31a211e8a3416657a943644a95591583c7 100644 (file)
                <operation name="test">\r
                        <soap:operation soapAction="#test" style="rpc"/>\r
                        <input>\r
-                               <soap:body parts="body" use="encoded" namespace="http://test-uri/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>\r
+                               <soap:body use="encoded" namespace="http://test-uri/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>\r
                        </input>\r
                        <output>\r
-                               <soap:body parts="body" use="encoded" namespace="http://test-uri/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>\r
+                               <soap:body use="encoded" namespace="http://test-uri/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>\r
                        </output>\r
                </operation>\r
        </binding>\r
index 5efc8605c52b32fc1a4cef98a8f411fb7802855f..e3d83f42d77f595e80eaee1872860a8fdc223c66 100644 (file)
@@ -37,7 +37,7 @@ $wsdl  = <<<EOF
                <operation name="test">
                        <soap:operation soapAction="#test" style="$style"/>
                        <input>
-                               <soap:body parts="body" use="$use" namespace="http://test-uri/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+                               <soap:body use="$use" namespace="http://test-uri/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
                        </input>
                </operation>
        </binding>