summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@php.net>2004-01-16 07:11:59 +0000
committerDmitry Stogov <dmitry@php.net>2004-01-16 07:11:59 +0000
commitad648d82e5acac9b22dde891c863b61a74a1a2b5 (patch)
tree6c2d0cd2d0f06d370bc00497a89520ecc2be8f59 /ext
parent071565178549a718e9a19c6f659723b22a49cb8f (diff)
downloadphp-git-ad648d82e5acac9b22dde891c863b61a74a1a2b5.tar.gz
SOAP 1.2: enc:id & enc:ref attributes support and fault codes (Sender/Receiver) where implemented
Diffstat (limited to 'ext')
-rw-r--r--ext/soap/TODO2
-rw-r--r--ext/soap/php_xml.c19
-rw-r--r--ext/soap/soap.c21
3 files changed, 39 insertions, 3 deletions
diff --git a/ext/soap/TODO b/ext/soap/TODO
index b4a744d97f..fcd61548d6 100644
--- a/ext/soap/TODO
+++ b/ext/soap/TODO
@@ -62,7 +62,7 @@ Encoding
SOAP 1.2 doesn't support partially transmitted and sparse arrays
- full support for structures???
+ references (id,href)
-- SOAP 1.2 (enc:id,enc:ref)
++ SOAP 1.2 (enc:id,enc:ref)
- references to external resources
- default values
- root attribute
diff --git a/ext/soap/php_xml.c b/ext/soap/php_xml.c
index ce560b6f35..5e55e467b6 100644
--- a/ext/soap/php_xml.c
+++ b/ext/soap/php_xml.c
@@ -162,7 +162,24 @@ xmlNodePtr check_and_resolve_href(xmlNodePtr data)
if (!ret) {
php_error(E_ERROR,"Unresolved reference '%s'",href->children->content);
}
- data = ret;
+ return ret;
+ } else {
+ /* TODO: External href....? */
+ php_error(E_ERROR,"External reference '%s'",href->children->content);
+ }
+ }
+ /* SOAP 1.2 enc:id enc:ref */
+ href = get_attribute_ex(data->properties, "ref", SOAP_1_2_ENC_NAMESPACE);
+ if (href) {
+ /* Internal href try and find node */
+ if (href->children->content[0] == '#') {
+ xmlNodePtr ret = get_node_with_attribute_recursive_ex(data->doc->children, NULL, NULL, "id", &href->children->content[1], SOAP_1_2_ENC_NAMESPACE);
+ if (!ret) {
+ php_error(E_ERROR,"Unresolved reference '%s'",href->children->content);
+ } else if (ret == data) {
+ php_error(E_ERROR,"Violation of id and ref information items '%s'",href->children->content);
+ }
+ return ret;
} else {
/* TODO: External href....? */
php_error(E_ERROR,"External reference '%s'",href->children->content);
diff --git a/ext/soap/soap.c b/ext/soap/soap.c
index 53afa15f4c..367ad69bce 100644
--- a/ext/soap/soap.c
+++ b/ext/soap/soap.c
@@ -1714,7 +1714,26 @@ static void set_soap_fault(zval *obj, char *fault_code, char *fault_string, char
add_property_string(obj, "faultstring", fault_string, 1);
}
if (fault_code != NULL) {
- add_property_string(obj, "faultcode", fault_code, 1);
+ int soap_version = SOAP_GLOBAL(soap_version);
+ smart_str code = {0};
+ if (soap_version == SOAP_1_1) {
+ smart_str_appendl(&code, SOAP_1_1_ENV_NS_PREFIX, sizeof(SOAP_1_1_ENV_NS_PREFIX)-1);
+ smart_str_appendc(&code, ':');
+ smart_str_appends(&code,fault_code);
+ } else if (soap_version == SOAP_1_2) {
+ smart_str_appendl(&code, SOAP_1_2_ENV_NS_PREFIX, sizeof(SOAP_1_2_ENV_NS_PREFIX)-1);
+ smart_str_appendc(&code, ':');
+ if (strcmp(fault_code,"Client") == 0) {
+ smart_str_appendl(&code,"Sencer",sizeof("Sender")-1);
+ } else if (strcmp(fault_code,"Server") == 0) {
+ smart_str_appendl(&code,"Receiver",sizeof("Receiver")-1);
+ } else {
+ smart_str_appends(&code,fault_code);
+ }
+ }
+ smart_str_0(&code);
+ add_property_string(obj, "faultcode", code.c, 1);
+ smart_str_free(&code);
}
if (fault_actor != NULL) {
add_property_string(obj, "faultactor", fault_actor, 1);