]> granicus.if.org Git - php/commitdiff
fix: proper handling of SOAP 1.1 href and unresolved attributes references
authorDmitry Stogov <dmitry@php.net>
Mon, 2 Feb 2004 17:39:10 +0000 (17:39 +0000)
committerDmitry Stogov <dmitry@php.net>
Mon, 2 Feb 2004 17:39:10 +0000 (17:39 +0000)
ext/soap/php_encoding.c
ext/soap/php_schema.c
ext/soap/php_xml.c
ext/soap/tests/soap12/T75.phpt [new file with mode: 0644]
ext/soap/tests/soap12/soap12-test.inc
ext/soap/tests/soap12/soap12-test.wsdl

index 2e9eb23b065b3f68345353efd7118d9fa0f067b8..12d0ca0395e59d5d421ad1be3e721f24a814540c 100644 (file)
@@ -2304,7 +2304,14 @@ xmlNodePtr sdl_guess_convert_xml(encodeTypePtr enc, zval *data, int style, xmlNo
 static xmlNodePtr check_and_resolve_href(xmlNodePtr data)
 {
        if (data && data->properties) {
-               xmlAttrPtr href = get_attribute(data->properties, "href");
+               xmlAttrPtr href;
+               
+               href = data->properties;
+               while (1) {
+                       href = get_attribute(href, "href");
+                 if (href == NULL || href->ns == NULL) {break;}
+                 href = href->next;
+               }
                if (href) {
                        /*  Internal href try and find node */
                        if (href->children->content[0] == '#') {
index 69372c39ce5754d0d1aa005c8e89ce4695778d2e..cde1a8ef8653539e5c640947dcd7254455647f19 100644 (file)
@@ -2009,6 +2009,13 @@ static void schema_attribute_fixup(sdlPtr sdl, sdlAttributePtr attr)
                                }
                                attr->encode = (*tmp)->encode;
                        }
+               } 
+               if (attr->name == NULL && attr->ref != NULL) {
+                       char *name, *ns;
+                       parse_namespace(attr->ref, &name, &ns);
+                       attr->name = strdup(name);
+                       if (name) {efree(name);}
+                       if (ns) {efree(ns);}
                }
                efree(attr->ref);
                attr->ref = NULL;
index 65e058c2bfd2893f7bedaf808e6de571f7785f6c..0f03d19fa710c55e01e131a2edd79c1831606e8c 100644 (file)
@@ -182,7 +182,7 @@ xmlNodePtr get_node_with_attribute_recursive_ex(xmlNodePtr node, char *name, cha
 
 int parse_namespace(const char *inval, char **value, char **namespace)
 {
-       char *found = strchr(inval, ':');
+       char *found = strrchr(inval, ':');
 
        if (found != NULL && found != inval) {
                (*namespace) = estrndup(inval, found - inval);
diff --git a/ext/soap/tests/soap12/T75.phpt b/ext/soap/tests/soap12/T75.phpt
new file mode 100644 (file)
index 0000000..3e2166d
--- /dev/null
@@ -0,0 +1,28 @@
+--TEST--
+SOAP 1.2: T75 echoResolvedRef
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+$HTTP_RAW_POST_DATA = <<<EOF
+<?xml version='1.0' ?>
+<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope"> 
+ <env:Header>
+  <test:echoResolvedRef xmlns:test="http://example.org/ts-tests"
+        env:role="http://www.w3.org/2003/05/soap-envelope/role/next"
+        env:mustUnderstand="1">
+    <test:RelativeReference xml:base="http://example.org/today/"
+          xlink:href="new.xml"
+          xmlns:xlink="http://www.w3.org/1999/xlink" />
+  </test:echoResolvedRef>
+ </env:Header>
+ <env:Body>
+ </env:Body>
+</env:Envelope>
+EOF;
+include "soap12-test.inc";
+?>
+--EXPECT--
+<?xml version="1.0" encoding="UTF-8"?>
+<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:ns1="http://example.org/ts-tests"><env:Header><ns1:responseResolvedRef>http://example.org/today/new.xml</ns1:responseResolvedRef></env:Header><env:Body/></env:Envelope>
+ok
index 47f39e2b413034d3d67a8b0c0507c3a33cabaf84..7d0033da566bb253c6e6228ece61dc6dc0fcb1e3 100644 (file)
@@ -107,6 +107,10 @@ class Soap12test {
        function echoHeader() {
          return $this->header;
        }
+
+       function echoResolvedRef($ref) {
+         return $ref->RelativeReference->base.$ref->RelativeReference->href;
+       }
 }
 
 $server = new soapserver("http://http://example.org/ts-tests","http://example.org/ts-tests/C");
index 83a6423176d875e285a91af32cb4f327000e2663..8993cf5b5eb283b0cec494205eae5d2e5dcbf1a2 100644 (file)
                <part name="responseHeader" element="test:echoHeaderResponse"/>\r
        </message>\r
 \r
+       <message name="echoResolvedRefRequest">\r
+               <part name="responseHeader" element="test:echoResolvedRef"/>\r
+       </message>\r
+       <message name="echoResolvedRefResponse">\r
+               <part name="responseHeader" element="test:responseResolvedRef"/>\r
+       </message>\r
+\r
        <!-- "unknown" header block -->\r
        <message name="UnknownHdrBlockLit">\r
                <part name="Unknown" element="test:Unknown" />\r
                        <input message="tns:echoHeaderRequest" />\r
                        <output message="tns:echoHeaderResponse" />\r
                </operation>\r
+               <operation name="echoResolvedRef">\r
+                       <input message="tns:echoResolvedRefRequest" />\r
+                       <output message="tns:echoResolvedRefResponse" />\r
+               </operation>\r
        </portType>\r
 \r
        <portType name="Soap12TestPortTypeRpc">\r
                        <soap12:operation/>\r
                        <input>\r
                                <soap12:body use="literal" />\r
-                               <soap12:header message="tns:echoOkRequest" part="echoOk" use="literal" />\r
-                               <soap12:header message="tns:UnknownHdrBlockLit" part="Unknown" use="literal" />\r
                        </input>\r
                </operation>\r
                <operation name="echoHeader">\r
                                <soap12:header message="tns:echoOkResponse" part="responseOk" use="literal" />\r
                        </output>\r
                </operation>\r
+               <operation name="echoResolvedRef">\r
+                       <soap12:operation/>\r
+                       <input>\r
+                               <soap12:body use="literal" />\r
+                       </input>\r
+                       <output>\r
+                               <soap12:body use="literal" />\r
+                       </output>\r
+               </operation>\r
        </binding>\r
 \r
        <binding name="Soap12TestRpcBinding" type="tns:Soap12TestPortTypeRpc">\r