static zval *to_zval_string(encodeTypePtr type, xmlNodePtr data);
static zval *to_zval_stringr(encodeTypePtr type, xmlNodePtr data);
static zval *to_zval_stringc(encodeTypePtr type, xmlNodePtr data);
+static zval *to_zval_stringb(encodeTypePtr type, xmlNodePtr data);
static zval *to_zval_map(encodeTypePtr type, xmlNodePtr data);
static zval *to_zval_null(encodeTypePtr type, xmlNodePtr data);
{{XSD_GMONTH, XSD_GMONTH_STRING, XSD_NAMESPACE, NULL}, to_zval_stringc, to_xml_gmonth},
{{XSD_DURATION, XSD_DURATION_STRING, XSD_NAMESPACE, NULL}, to_zval_stringc, to_xml_duration},
- {{XSD_HEXBINARY, XSD_HEXBINARY_STRING, XSD_NAMESPACE, NULL}, to_zval_stringc, to_xml_stringl},
- {{XSD_BASE64BINARY, XSD_BASE64BINARY_STRING, XSD_NAMESPACE, NULL}, to_zval_stringc, to_xml_stringl},
+ {{XSD_HEXBINARY, XSD_HEXBINARY_STRING, XSD_NAMESPACE, NULL}, to_zval_stringb, to_xml_stringl},
+ {{XSD_BASE64BINARY, XSD_BASE64BINARY_STRING, XSD_NAMESPACE, NULL}, to_zval_stringb, to_xml_stringl},
{{XSD_LONG, XSD_LONG_STRING, XSD_NAMESPACE, NULL}, to_zval_long, to_xml_long},
{{XSD_INT, XSD_INT_STRING, XSD_NAMESPACE, NULL}, to_zval_long, to_xml_long},
FIND_XML_NULL(data, ret);
if (data && data->children) {
if (data->children->type == XML_TEXT_NODE && data->children->next == NULL) {
- ZVAL_STRING(ret, data->children->content, 1);
+ TSRMLS_FETCH();
+
+ if (SOAP_GLOBAL(encoding) != NULL) {
+ xmlBufferPtr in = xmlBufferCreateStatic(data->children->content, strlen(data->children->content));
+ xmlBufferPtr out = xmlBufferCreate();
+ int n = xmlCharEncOutFunc(SOAP_GLOBAL(encoding), out, in);
+
+ if (n >= 0) {
+ ZVAL_STRING(ret, (char*)xmlBufferContent(out), 1);
+ } else {
+ ZVAL_STRING(ret, data->children->content, 1);
+ }
+ xmlBufferFree(out);
+ xmlBufferFree(in);
+ } else {
+ ZVAL_STRING(ret, data->children->content, 1);
+ }
} else if (data->children->type == XML_CDATA_SECTION_NODE && data->children->next == NULL) {
ZVAL_STRING(ret, data->children->content, 1);
} else {
FIND_XML_NULL(data, ret);
if (data && data->children) {
if (data->children->type == XML_TEXT_NODE && data->children->next == NULL) {
+ TSRMLS_FETCH();
+
whiteSpace_replace(data->children->content);
- ZVAL_STRING(ret, data->children->content, 1);
+ if (SOAP_GLOBAL(encoding) != NULL) {
+ xmlBufferPtr in = xmlBufferCreateStatic(data->children->content, strlen(data->children->content));
+ xmlBufferPtr out = xmlBufferCreate();
+ int n = xmlCharEncOutFunc(SOAP_GLOBAL(encoding), out, in);
+
+ if (n >= 0) {
+ ZVAL_STRING(ret, (char*)xmlBufferContent(out), 1);
+ } else {
+ ZVAL_STRING(ret, data->children->content, 1);
+ }
+ xmlBufferFree(out);
+ xmlBufferFree(in);
+ } else {
+ ZVAL_STRING(ret, data->children->content, 1);
+ }
} else if (data->children->type == XML_CDATA_SECTION_NODE && data->children->next == NULL) {
ZVAL_STRING(ret, data->children->content, 1);
} else {
}
static zval *to_zval_stringc(encodeTypePtr type, xmlNodePtr data)
+{
+ zval *ret;
+ MAKE_STD_ZVAL(ret);
+ FIND_XML_NULL(data, ret);
+ if (data && data->children) {
+ if (data->children->type == XML_TEXT_NODE && data->children->next == NULL) {
+ TSRMLS_FETCH();
+
+ whiteSpace_collapse(data->children->content);
+ if (SOAP_GLOBAL(encoding) != NULL) {
+ xmlBufferPtr in = xmlBufferCreateStatic(data->children->content, strlen(data->children->content));
+ xmlBufferPtr out = xmlBufferCreate();
+ int n = xmlCharEncOutFunc(SOAP_GLOBAL(encoding), out, in);
+
+ if (n >= 0) {
+ ZVAL_STRING(ret, (char*)xmlBufferContent(out), 1);
+ } else {
+ ZVAL_STRING(ret, data->children->content, 1);
+ }
+ xmlBufferFree(out);
+ xmlBufferFree(in);
+ } else {
+ ZVAL_STRING(ret, data->children->content, 1);
+ }
+ } else if (data->children->type == XML_CDATA_SECTION_NODE && data->children->next == NULL) {
+ ZVAL_STRING(ret, data->children->content, 1);
+ } else {
+ soap_error0(E_ERROR, "Encoding: Violation of encoding rules");
+ }
+ } else {
+ ZVAL_EMPTY_STRING(ret);
+ }
+ return ret;
+}
+
+static zval *to_zval_stringb(encodeTypePtr type, xmlNodePtr data)
{
zval *ret;
MAKE_STD_ZVAL(ret);
zval_dtor(&tmp);
}
+ if (SOAP_GLOBAL(encoding) != NULL) {
+ xmlBufferPtr in = xmlBufferCreateStatic(str, new_len);
+ xmlBufferPtr out = xmlBufferCreate();
+ int n = xmlCharEncInFunc(SOAP_GLOBAL(encoding), out, in);
+
+ if (n >= 0) {
+ efree(str);
+ str = estrdup(xmlBufferContent(out));
+ new_len = n;
+ } else if (!xmlCheckUTF8(str)) {
+ soap_error1(E_ERROR, "Encoding: string '%s' is not a valid utf-8 string", str);
+ }
+ xmlBufferFree(out);
+ xmlBufferFree(in);
+ } else if (!xmlCheckUTF8(str)) {
+ soap_error1(E_ERROR, "Encoding: string '%s' is not a valid utf-8 string", str);
+ }
+
xmlNodeSetContentLen(ret, str, new_len);
efree(str);
SOAP_GLOBAL(error_object) = NULL;
SOAP_GLOBAL(sdl) = NULL;
SOAP_GLOBAL(soap_version) = SOAP_1_1;
+ SOAP_GLOBAL(encoding) = NULL;
return SUCCESS;
}
Z_TYPE_PP(tmp) == IS_STRING) {
service->actor = estrndup(Z_STRVAL_PP(tmp), Z_STRLEN_PP(tmp));
}
+
+ if (zend_hash_find(ht, "encoding", sizeof("encoding"), (void**)&tmp) == SUCCESS &&
+ Z_TYPE_PP(tmp) == IS_STRING) {
+ xmlCharEncodingHandlerPtr encoding;
+
+ encoding = xmlFindCharEncodingHandler(Z_STRVAL_PP(tmp));
+ if (encoding == NULL) {
+ php_error_docref(NULL TSRMLS_CC, E_ERROR, "Invalid arguments. Invalid 'encoding' option - '%s'.", Z_STRVAL_PP(tmp));
+ } else {
+ service->encoding = encoding;
+ }
+ }
+
} else if (wsdl == NULL) {
php_error_docref(NULL TSRMLS_CC, E_ERROR, "Invalid arguments. 'uri' option is required in nonWSDL mode.");
}
sdlFunctionPtr function;
char *arg = NULL;
int arg_len;
+ xmlCharEncodingHandlerPtr old_encoding;
SOAP_SERVER_BEGIN_CODE();
old_sdl = SOAP_GLOBAL(sdl);
SOAP_GLOBAL(sdl) = service->sdl;
+ old_encoding = SOAP_GLOBAL(encoding);
+ SOAP_GLOBAL(encoding) = service->encoding;
old_soap_version = SOAP_GLOBAL(soap_version);
function = deserialize_function_call(service->sdl, doc_request, service->actor, &function_name, &num_params, ¶ms, &soap_version, &soap_headers TSRMLS_CC);
xmlFreeDoc(doc_request);
fail:
SOAP_GLOBAL(soap_version) = old_soap_version;
+ SOAP_GLOBAL(encoding) = old_encoding;
SOAP_GLOBAL(sdl) = old_sdl;
/* Free soap headers */
zend_hash_exists(EG(function_table), "gzencode", sizeof("gzencode"))) {
add_property_long(this_ptr, "compression", Z_LVAL_PP(tmp));
}
+ if (zend_hash_find(ht, "encoding", sizeof("encoding"), (void**)&tmp) == SUCCESS &&
+ Z_TYPE_PP(tmp) == IS_STRING) {
+ xmlCharEncodingHandlerPtr encoding;
+
+ encoding = xmlFindCharEncodingHandler(Z_STRVAL_PP(tmp));
+ if (encoding == NULL) {
+ php_error_docref(NULL TSRMLS_CC, E_ERROR, "Invalid 'encoding' option - '%s'.", Z_STRVAL_PP(tmp));
+ } else {
+ xmlCharEncCloseFunc(encoding);
+ add_property_stringl(this_ptr, "_encoding", Z_STRVAL_PP(tmp), Z_STRLEN_PP(tmp), 1);
+ }
+ }
} else if (wsdl == NULL) {
php_error_docref(NULL TSRMLS_CC, E_ERROR, "'location' and 'uri' options are requred in nonWSDL mode.");
return;
int ret = FALSE;
int soap_version;
zval response;
+ xmlCharEncodingHandlerPtr old_encoding;
SOAP_CLIENT_BEGIN_CODE();
SOAP_GLOBAL(soap_version) = soap_version;
old_sdl = SOAP_GLOBAL(sdl);
SOAP_GLOBAL(sdl) = sdl;
+ old_encoding = SOAP_GLOBAL(encoding);
+ if (zend_hash_find(Z_OBJPROP_P(this_ptr), "_encoding", sizeof("_encoding"), (void **) &tmp) == SUCCESS &&
+ Z_TYPE_PP(tmp) == IS_STRING) {
+ SOAP_GLOBAL(encoding) = xmlFindCharEncodingHandler(Z_STRVAL_PP(tmp));
+ } else {
+ SOAP_GLOBAL(encoding) = NULL;
+ }
+
if (sdl != NULL) {
fn = get_function(sdl, function);
if (fn != NULL) {
zend_throw_exception_object(exception TSRMLS_CC);
}
#endif
+ if (SOAP_GLOBAL(encoding) != NULL) {
+ xmlCharEncCloseFunc(SOAP_GLOBAL(encoding));
+ }
+ SOAP_GLOBAL(encoding) = old_encoding;
SOAP_GLOBAL(sdl) = old_sdl;
SOAP_CLIENT_END_CODE();
}
if (service->sdl) {
delete_sdl(service->sdl);
}
+ if (service->encoding) {
+ xmlCharEncCloseFunc(service->encoding);
+ }
efree(service);
}