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] == '#') {
}
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;
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);
--- /dev/null
+--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
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");
<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