diff options
Diffstat (limited to 'ext/soap/soap.c')
-rw-r--r-- | ext/soap/soap.c | 248 |
1 files changed, 137 insertions, 111 deletions
diff --git a/ext/soap/soap.c b/ext/soap/soap.c index 78f4326e4e..466e0e534a 100644 --- a/ext/soap/soap.c +++ b/ext/soap/soap.c @@ -279,11 +279,13 @@ PHP_METHOD(SoapHeader, SoapHeader); /* {{{ arginfo */ #ifdef ZEND_ENGINE_2 +static ZEND_BEGIN_ARG_INFO_EX(arginfo_soapparam_soapparam, 0, 0, 2) ZEND_ARG_INFO(0, data) ZEND_ARG_INFO(0, name) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_soapheader_soapheader, 0, 0, 2) ZEND_ARG_INFO(0, namespace) ZEND_ARG_INFO(0, name) @@ -292,6 +294,7 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_soapheader_soapheader, 0, 0, 2) ZEND_ARG_INFO(0, actor) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_soapfault_soapfault, 0, 0, 2) ZEND_ARG_INFO(0, faultcode) ZEND_ARG_INFO(0, faultstring) @@ -301,6 +304,7 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_soapfault_soapfault, 0, 0, 2) ZEND_ARG_INFO(0, headerfault) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_soapvar_soapvar, 0, 0, 2) ZEND_ARG_INFO(0, data) ZEND_ARG_INFO(0, encoding) @@ -310,6 +314,7 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_soapvar_soapvar, 0, 0, 2) ZEND_ARG_INFO(0, node_namespace) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_soapserver_fault, 0, 0, 2) ZEND_ARG_INFO(0, code) ZEND_ARG_INFO(0, string) @@ -318,49 +323,60 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_soapserver_fault, 0, 0, 2) ZEND_ARG_INFO(0, name) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_soapserver_addsoapheader, 0, 0, 1) ZEND_ARG_INFO(0, object) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_soapserver_soapserver, 0, 0, 1) ZEND_ARG_INFO(0, wsdl) ZEND_ARG_INFO(0, options) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_soapserver_setpersistence, 0, 0, 1) ZEND_ARG_INFO(0, mode) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_soapserver_setclass, 0, 0, 1) ZEND_ARG_INFO(0, class_name) ZEND_ARG_INFO(0, args) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_soapserver_setobject, 0, 0, 1) ZEND_ARG_INFO(0, object) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO(arginfo_soapserver_getfunctions, 0) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_soapserver_addfunction, 0, 0, 1) ZEND_ARG_INFO(0, functions) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_soapserver_handle, 0, 0, 0) ZEND_ARG_INFO(0, soap_request) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_soapclient_soapclient, 0, 0, 1) ZEND_ARG_INFO(0, wsdl) ZEND_ARG_INFO(0, options) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_soapclient___call, 0, 0, 2) ZEND_ARG_INFO(0, function_name) ZEND_ARG_INFO(0, arguments) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_soapclient___soapcall, 0, 0, 2) ZEND_ARG_INFO(0, function_name) ZEND_ARG_INFO(0, arguments) @@ -369,24 +385,31 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_soapclient___soapcall, 0, 0, 2) ZEND_ARG_INFO(1, output_headers) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO(arginfo_soapclient___getfunctions, 0) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO(arginfo_soapclient___gettypes, 0) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO(arginfo_soapclient___getlastrequest, 0) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO(arginfo_soapclient___getlastresponse, 0) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO(arginfo_soapclient___getlastrequestheaders, 0) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO(arginfo_soapclient___getlastresponseheaders, 0) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_soapclient___dorequest, 0, 0, 4) ZEND_ARG_INFO(0, request) ZEND_ARG_INFO(0, location) @@ -395,23 +418,28 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_soapclient___dorequest, 0, 0, 4) ZEND_ARG_INFO(0, one_way) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_soapclient___setcookie, 0, 0, 1) ZEND_ARG_INFO(0, name) ZEND_ARG_INFO(0, value) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_soapclient___setsoapheaders, 0, 0, 1) ZEND_ARG_INFO(0, soapheaders) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_soapclient___setlocation, 0, 0, 0) ZEND_ARG_INFO(0, new_location) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_soap_use_soap_error_handler, 0, 0, 0) ZEND_ARG_INFO(0, handler) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_soap_is_soap_fault, 0, 0, 1) ZEND_ARG_INFO(0, object) ZEND_END_ARG_INFO() @@ -859,11 +887,10 @@ PHP_METHOD(SoapParam, SoapParam) int name_length; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "zs", &data, &name, &name_length) == FAILURE) { - return; + php_error_docref(NULL TSRMLS_CC, E_ERROR, "Invalid parameters"); } if (name_length == 0) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid parameter name"); - return; + php_error_docref(NULL TSRMLS_CC, E_ERROR, "Invalid parameters. Invalid parameter name."); } #ifndef ZEND_ENGINE_2 @@ -885,15 +912,13 @@ PHP_METHOD(SoapHeader, SoapHeader) zend_bool must_understand = 0; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss|zbz", &ns, &ns_len, &name, &name_len, &data, &must_understand, &actor) == FAILURE) { - return; + php_error_docref(NULL TSRMLS_CC, E_ERROR, "Invalid parameters"); } if (ns_len == 0) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid namespace"); - return; + php_error_docref(NULL TSRMLS_CC, E_ERROR, "Invalid parameters. Invalid namespace."); } if (name_len == 0) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid header name"); - return; + php_error_docref(NULL TSRMLS_CC, E_ERROR, "Invalid parameters. Invalid header name."); } add_property_stringl(this_ptr, "namespace", ns, ns_len, 1); @@ -914,7 +939,7 @@ PHP_METHOD(SoapHeader, SoapHeader) } else if (Z_TYPE_P(actor) == IS_STRING && Z_STRLEN_P(actor) > 0) { add_property_stringl(this_ptr, "actor", Z_STRVAL_P(actor), Z_STRLEN_P(actor), 1); } else { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid actor"); + php_error_docref(NULL TSRMLS_CC, E_ERROR, "Invalid parameters. Invalid actor."); } } @@ -923,7 +948,7 @@ PHP_METHOD(SoapHeader, SoapHeader) PHP_METHOD(SoapFault, SoapFault) { char *fault_string = NULL, *fault_code = NULL, *fault_actor = NULL, *name = NULL, *fault_code_ns = NULL; - int fault_string_len, fault_actor_len = 0, name_len = 0, fault_code_len = 0; + int fault_string_len, fault_actor_len, name_len, fault_code_len = 0; zval *code = NULL, *details = NULL, *headerfault = NULL; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "zs|s!z!s!z", @@ -931,9 +956,8 @@ PHP_METHOD(SoapFault, SoapFault) &fault_string, &fault_string_len, &fault_actor, &fault_actor_len, &details, &name, &name_len, &headerfault) == FAILURE) { - return; + php_error_docref(NULL TSRMLS_CC, E_ERROR, "Invalid parameters"); } - if (Z_TYPE_P(code) == IS_NULL) { } else if (Z_TYPE_P(code) == IS_STRING) { fault_code = Z_STRVAL_P(code); @@ -950,16 +974,13 @@ PHP_METHOD(SoapFault, SoapFault) fault_code = Z_STRVAL_PP(t_code); fault_code_len = Z_STRLEN_PP(t_code); } else { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid fault code"); - return; + php_error_docref(NULL TSRMLS_CC, E_ERROR, "Invalid parameters. Invalid fault code."); } } else { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid fault code"); - return; + php_error_docref(NULL TSRMLS_CC, E_ERROR, "Invalid parameters. Invalid fault code."); } if (fault_code != NULL && fault_code_len == 0) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid fault code"); - return; + php_error_docref(NULL TSRMLS_CC, E_ERROR, "Invalid parameters. Invalid fault code."); } if (name != NULL && name_len == 0) { name = NULL; @@ -999,7 +1020,7 @@ PHP_METHOD(SoapFault, __toString) fci.function_table = &Z_OBJCE_P(getThis())->function_table; fci.function_name = &fname; fci.symbol_table = NULL; - fci.object_ptr = getThis(); + fci.object_pp = &getThis(); fci.retval_ptr_ptr = &trace; fci.param_count = 0; fci.params = NULL; @@ -1024,10 +1045,10 @@ PHP_METHOD(SoapVar, SoapVar) { zval *data, *type; char *stype = NULL, *ns = NULL, *name = NULL, *namens = NULL; - int stype_len = 0, ns_len = 0, name_len = 0, namens_len = 0; + int stype_len, ns_len, name_len, namens_len; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z!z|ssss", &data, &type, &stype, &stype_len, &ns, &ns_len, &name, &name_len, &namens, &namens_len) == FAILURE) { - return; + php_error_docref(NULL TSRMLS_CC, E_ERROR, "Invalid parameters"); } if (Z_TYPE_P(type) == IS_NULL) { @@ -1036,8 +1057,7 @@ PHP_METHOD(SoapVar, SoapVar) if (zend_hash_index_exists(&SOAP_GLOBAL(defEncIndex), Z_LVAL_P(type))) { add_property_long(this_ptr, "enc_type", Z_LVAL_P(type)); } else { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid type ID"); - return; + php_error_docref(NULL TSRMLS_CC, E_ERROR, "Invalid type ID"); } } @@ -1080,8 +1100,7 @@ static HashTable* soap_create_typemap(sdlPtr sdl, HashTable *ht TSRMLS_DC) encodePtr enc, new_enc; if (Z_TYPE_PP(tmp) != IS_ARRAY) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Wrong 'typemap' option"); - return NULL; + php_error_docref(NULL TSRMLS_CC, E_ERROR, "Wrong 'typemap' option"); } ht2 = Z_ARRVAL_PP(tmp); @@ -1186,7 +1205,7 @@ static HashTable* soap_create_typemap(sdlPtr sdl, HashTable *ht TSRMLS_DC) PHP_METHOD(SoapServer, SoapServer) { soapServicePtr service; - zval *wsdl = NULL, *options = NULL; + zval *wsdl, *options = NULL; int ret; int version = SOAP_1_1; long cache_wsdl; @@ -1194,14 +1213,17 @@ PHP_METHOD(SoapServer, SoapServer) SOAP_SERVER_BEGIN_CODE(); - if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, ZEND_NUM_ARGS() TSRMLS_CC, "z|a", &wsdl, &options) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z|a", &wsdl, &options) == FAILURE) { php_error_docref(NULL TSRMLS_CC, E_ERROR, "Invalid parameters"); } - if (Z_TYPE_P(wsdl) != IS_STRING && Z_TYPE_P(wsdl) != IS_NULL) { + if (Z_TYPE_P(wsdl) == IS_STRING) { + } else if (Z_TYPE_P(wsdl) == IS_NULL) { + wsdl = NULL; + } else { php_error_docref(NULL TSRMLS_CC, E_ERROR, "Invalid parameters"); } - + service = emalloc(sizeof(soapService)); memset(service, 0, sizeof(soapService)); service->send_errors = 1; @@ -1222,8 +1244,9 @@ PHP_METHOD(SoapServer, SoapServer) if (zend_hash_find(ht, "uri", sizeof("uri"), (void**)&tmp) == SUCCESS && Z_TYPE_PP(tmp) == IS_STRING) { service->uri = estrndup(Z_STRVAL_PP(tmp), Z_STRLEN_PP(tmp)); - } else if (Z_TYPE_P(wsdl) == IS_NULL) { - php_error_docref(NULL TSRMLS_CC, E_ERROR, "'uri' option is required in nonWSDL mode"); + } else if (wsdl == NULL) { + php_error_docref(NULL TSRMLS_CC, E_ERROR, "Invalid arguments. 'uri' option is required in nonWSDL mode."); + return; } if (zend_hash_find(ht, "actor", sizeof("actor"), (void**)&tmp) == SUCCESS && @@ -1236,11 +1259,11 @@ PHP_METHOD(SoapServer, SoapServer) 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 { - service->encoding = encoding; - } + 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; + } } if (zend_hash_find(ht, "classmap", sizeof("classmap"), (void**)&tmp) == SUCCESS && @@ -1273,8 +1296,8 @@ PHP_METHOD(SoapServer, SoapServer) service->send_errors = Z_LVAL_PP(tmp); } - } else if (Z_TYPE_P(wsdl) == IS_NULL) { - php_error_docref(NULL TSRMLS_CC, E_ERROR, "'uri' option is required in nonWSDL mode"); + } else if (wsdl == NULL) { + php_error_docref(NULL TSRMLS_CC, E_ERROR, "Invalid arguments. 'uri' option is required in nonWSDL mode."); } service->version = version; @@ -1283,7 +1306,7 @@ PHP_METHOD(SoapServer, SoapServer) service->soap_functions.ft = emalloc(sizeof(HashTable)); zend_hash_init(service->soap_functions.ft, 0, NULL, ZVAL_PTR_DTOR, 0); - if (Z_TYPE_P(wsdl) != IS_NULL) { + if (wsdl) { service->sdl = get_sdl(this_ptr, Z_STRVAL_P(wsdl), cache_wsdl TSRMLS_CC); if (service->uri == NULL) { if (service->sdl->target_ns) { @@ -1324,12 +1347,10 @@ PHP_METHOD(SoapServer, setPersistence) value == SOAP_PERSISTENCE_REQUEST) { service->soap_class.persistance = value; } else { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Tried to set persistence with bogus value (%ld)", value); - return; + php_error_docref(NULL TSRMLS_CC, E_ERROR, "Tried to set persistence with bogus value (%ld)", value); } } else { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Tried to set persistence when you are using you SOAP SERVER in function mode, no persistence needed"); - return; + php_error_docref(NULL TSRMLS_CC, E_ERROR, "Tried to set persistence when you are using you SOAP SERVER in function mode, no persistence needed"); } } @@ -1385,8 +1406,7 @@ PHP_METHOD(SoapServer, setClass) } } } else { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Tried to set a non existant class (%s)", classname); - return; + php_error_docref(NULL TSRMLS_CC, E_ERROR, "Tried to set a non existant class (%s)", classname); } if (argv) { @@ -1410,7 +1430,7 @@ PHP_METHOD(SoapServer, setObject) FETCH_THIS_SERVICE(service); if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "o", &obj) == FAILURE) { - return; + php_error_docref(NULL TSRMLS_CC, E_ERROR, "Invalid parameters"); } service->type = SOAP_OBJECT; @@ -1487,7 +1507,7 @@ PHP_METHOD(SoapServer, addFunction) FETCH_THIS_SERVICE(service); if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &function_name) == FAILURE) { - return; + php_error_docref(NULL TSRMLS_CC, E_ERROR, "Invalid parameters"); } /* TODO: could use zend_is_callable here */ @@ -1509,8 +1529,7 @@ PHP_METHOD(SoapServer, addFunction) zend_function *f; if (Z_TYPE_PP(tmp_function) != IS_STRING) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Tried to add a function that isn't a string"); - return; + php_error_docref(NULL TSRMLS_CC, E_ERROR, "Tried to add a function that isn't a string"); } key_len = Z_STRLEN_PP(tmp_function); @@ -1518,8 +1537,7 @@ PHP_METHOD(SoapServer, addFunction) zend_str_tolower_copy(key, Z_STRVAL_PP(tmp_function), key_len); if (zend_hash_find(EG(function_table), key, key_len+1, (void**)&f) == FAILURE) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Tried to add a non existant function '%s'", Z_STRVAL_PP(tmp_function)); - return; + php_error_docref(NULL TSRMLS_CC, E_ERROR, "Tried to add a non existant function '%s'", Z_STRVAL_PP(tmp_function)); } MAKE_STD_ZVAL(function_copy); @@ -1540,8 +1558,7 @@ PHP_METHOD(SoapServer, addFunction) zend_str_tolower_copy(key, Z_STRVAL_P(function_name), key_len); if (zend_hash_find(EG(function_table), key, key_len+1, (void**)&f) == FAILURE) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Tried to add a non existant function '%s'", Z_STRVAL_P(function_name)); - return; + php_error_docref(NULL TSRMLS_CC, E_ERROR, "Tried to add a non existant function '%s'", Z_STRVAL_P(function_name)); } if (service->soap_functions.ft == NULL) { service->soap_functions.functions_all = FALSE; @@ -1562,8 +1579,7 @@ PHP_METHOD(SoapServer, addFunction) } service->soap_functions.functions_all = TRUE; } else { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid value passed"); - return; + php_error_docref(NULL TSRMLS_CC, E_ERROR, "Invalid value passed"); } } @@ -1588,7 +1604,7 @@ PHP_METHOD(SoapServer, handle) soapHeader *soap_headers = NULL; sdlFunctionPtr function; char *arg = NULL; - int arg_len = 0; + int arg_len; xmlCharEncodingHandlerPtr old_encoding; HashTable *old_class_map, *old_typemap; int old_features; @@ -1597,9 +1613,8 @@ PHP_METHOD(SoapServer, handle) FETCH_THIS_SERVICE(service); SOAP_GLOBAL(soap_version) = service->version; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s", &arg, &arg_len) == FAILURE) { - return; + php_error_docref(NULL TSRMLS_CC, E_ERROR, "Invalid parameters"); } if (SG(request_info).request_method && @@ -1686,16 +1701,14 @@ PHP_METHOD(SoapServer, handle) ZVAL_STRINGL(params[0], post_data, post_data_length, 0); INIT_PZVAL(params[0]); } else { - php_error_docref(NULL TSRMLS_CC, E_WARNING,"Request is compressed with unknown compression '%s'",Z_STRVAL_PP(encoding)); - return; + php_error_docref(NULL TSRMLS_CC, E_ERROR,"Request is compressed with unknown compression '%s'",Z_STRVAL_PP(encoding)); } if (call_user_function(CG(function_table), (zval**)NULL, &func, &retval, 1, params TSRMLS_CC) == SUCCESS && Z_TYPE(retval) == IS_STRING) { doc_request = soap_xmlParseMemory(Z_STRVAL(retval),Z_STRLEN(retval)); zval_dtor(&retval); } else { - php_error_docref(NULL TSRMLS_CC, E_WARNING,"Can't uncompress compressed request"); - return; + php_error_docref(NULL TSRMLS_CC, E_ERROR,"Can't uncompress compressed request"); } } else { doc_request = soap_xmlParseMemory(post_data, post_data_length); @@ -1893,8 +1906,7 @@ PHP_METHOD(SoapServer, handle) call_status = call_user_function(EG(function_table), NULL, &h->function_name, &h->retval, h->num_params, h->parameters TSRMLS_CC); } if (call_status != SUCCESS) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Function '%s' call failed", Z_STRVAL(h->function_name)); - return; + php_error_docref(NULL TSRMLS_CC, E_ERROR, "Function '%s' call failed", Z_STRVAL(h->function_name)); } if (Z_TYPE(h->retval) == IS_OBJECT && instanceof_function(Z_OBJCE(h->retval), soap_fault_class_entry TSRMLS_CC)) { @@ -1998,8 +2010,7 @@ PHP_METHOD(SoapServer, handle) doc_return = serialize_response_call(function, response_name, service->uri, retval, soap_headers, soap_version TSRMLS_CC); efree(response_name); } else { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Function '%s' call failed", Z_STRVAL(function_name)); - return; + php_error_docref(NULL TSRMLS_CC, E_ERROR, "Function '%s' call failed", Z_STRVAL(function_name)); } #ifdef ZEND_ENGINE_2 @@ -2126,7 +2137,7 @@ fail: PHP_METHOD(SoapServer, fault) { char *code, *string, *actor=NULL, *name=NULL; - int code_len, string_len, actor_len = 0, name_len = 0; + int code_len, string_len, actor_len, name_len; zval* details = NULL; SOAP_SERVER_BEGIN_CODE(); @@ -2134,7 +2145,7 @@ PHP_METHOD(SoapServer, fault) if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss|szs", &code, &code_len, &string, &string_len, &actor, &actor_len, &details, &name, &name_len) == FAILURE) { - return; + php_error_docref(NULL TSRMLS_CC, E_ERROR, "Invalid parameters"); } soap_server_fault(code, string, actor, details, name TSRMLS_CC); @@ -2153,12 +2164,11 @@ PHP_METHOD(SoapServer, addSoapHeader) FETCH_THIS_SERVICE(service); if (!service || !service->soap_headers_ptr) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "The SoapServer::addSoapHeader function may be called only during SOAP request processing"); - return; + php_error_docref(NULL TSRMLS_CC, E_ERROR, "The SoapServer::addSoapHeader function may be called only during SOAP request processing"); } if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O", &fault, soap_header_class_entry) == FAILURE) { - return; + php_error_docref(NULL TSRMLS_CC, E_ERROR, "Invalid parameters"); } p = service->soap_headers_ptr; @@ -2474,7 +2484,8 @@ PHP_FUNCTION(is_soap_fault) PHP_METHOD(SoapClient, SoapClient) { - zval *wsdl, *options = NULL; + zval *wsdl; + zval *options = NULL; int soap_version = SOAP_1_1; php_stream_context *context = NULL; long cache_wsdl; @@ -2483,12 +2494,17 @@ PHP_METHOD(SoapClient, SoapClient) SOAP_CLIENT_BEGIN_CODE(); - if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, ZEND_NUM_ARGS() TSRMLS_CC, "z|a", &wsdl, &options) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z|a", &wsdl, &options) == FAILURE) { php_error_docref(NULL TSRMLS_CC, E_ERROR, "Invalid parameters"); + return; } - if (Z_TYPE_P(wsdl) != IS_STRING && Z_TYPE_P(wsdl) != IS_NULL) { + if (Z_TYPE_P(wsdl) == IS_STRING) { + } else if (Z_TYPE_P(wsdl) != IS_NULL ) { php_error_docref(NULL TSRMLS_CC, E_ERROR, "$wsdl must be string or null"); + return; + } else { + wsdl = NULL; } cache_wsdl = SOAP_GLOBAL(cache); @@ -2497,13 +2513,14 @@ PHP_METHOD(SoapClient, SoapClient) HashTable *ht = Z_ARRVAL_P(options); zval **tmp; - if (Z_TYPE_P(wsdl) == IS_NULL) { + if (wsdl == NULL) { /* Fetching non-WSDL mode options */ if (zend_hash_find(ht, "uri", sizeof("uri"), (void**)&tmp) == SUCCESS && Z_TYPE_PP(tmp) == IS_STRING) { add_property_stringl(this_ptr, "uri", Z_STRVAL_PP(tmp), Z_STRLEN_PP(tmp), 1); } else { php_error_docref(NULL TSRMLS_CC, E_ERROR, "'uri' option is required in nonWSDL mode"); + return; } if (zend_hash_find(ht, "style", sizeof("style"), (void**)&tmp) == SUCCESS && @@ -2522,14 +2539,14 @@ PHP_METHOD(SoapClient, SoapClient) if (zend_hash_find(ht, "stream_context", sizeof("stream_context"), (void**)&tmp) == SUCCESS && Z_TYPE_PP(tmp) == IS_RESOURCE) { context = php_stream_context_from_zval(*tmp, 1); - zend_list_addref(context->rsrc_id); } if (zend_hash_find(ht, "location", sizeof("location"), (void**)&tmp) == SUCCESS && Z_TYPE_PP(tmp) == IS_STRING) { add_property_stringl(this_ptr, "location", Z_STRVAL_PP(tmp), Z_STRLEN_PP(tmp), 1); - } else if (Z_TYPE_P(wsdl) == IS_NULL) { + } else if (wsdl == NULL) { php_error_docref(NULL TSRMLS_CC, E_ERROR, "'location' option is required in nonWSDL mode"); + return; } if (zend_hash_find(ht, "soap_version", sizeof("soap_version"), (void**)&tmp) == SUCCESS) { @@ -2604,10 +2621,10 @@ PHP_METHOD(SoapClient, SoapClient) xmlCharEncodingHandlerPtr encoding; encoding = xmlFindCharEncodingHandler(Z_STRVAL_PP(tmp)); - if (encoding == NULL) { + if (encoding == NULL) { php_error_docref(NULL TSRMLS_CC, E_ERROR, "Invalid 'encoding' option - '%s'", Z_STRVAL_PP(tmp)); - } else { - xmlCharEncCloseFunc(encoding); + } else { + xmlCharEncCloseFunc(encoding); add_property_stringl(this_ptr, "_encoding", Z_STRVAL_PP(tmp), Z_STRLEN_PP(tmp), 1); } } @@ -2656,13 +2673,15 @@ PHP_METHOD(SoapClient, SoapClient) Z_TYPE_PP(tmp) == IS_STRING) { add_property_stringl(this_ptr, "_user_agent", Z_STRVAL_PP(tmp), Z_STRLEN_PP(tmp), 1); } - } else if (Z_TYPE_P(wsdl) == IS_NULL) { + + } else if (wsdl == NULL) { php_error_docref(NULL TSRMLS_CC, E_ERROR, "'location' and 'uri' options are required in nonWSDL mode"); + return; } add_property_long(this_ptr, "_soap_version", soap_version); - if (Z_TYPE_P(wsdl) != IS_NULL) { + if (wsdl) { int old_soap_version, ret; old_soap_version = SOAP_GLOBAL(soap_version); @@ -2999,26 +3018,30 @@ PHP_METHOD(SoapClient, __call) HashPosition pos; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sa|a!zz", + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sa|zzz", &function, &function_len, &args, &options, &headers, &output_headers) == FAILURE) { - return; + php_error_docref(NULL TSRMLS_CC, E_ERROR, "Invalid parameters"); } if (options) { - HashTable *ht = Z_ARRVAL_P(options); - if (zend_hash_find(ht, "location", sizeof("location"), (void**)&tmp) == SUCCESS && - Z_TYPE_PP(tmp) == IS_STRING) { - location = Z_STRVAL_PP(tmp); - } + if (Z_TYPE_P(options) == IS_ARRAY) { + HashTable *ht = Z_ARRVAL_P(options); + if (zend_hash_find(ht, "location", sizeof("location"), (void**)&tmp) == SUCCESS && + Z_TYPE_PP(tmp) == IS_STRING) { + location = Z_STRVAL_PP(tmp); + } - if (zend_hash_find(ht, "soapaction", sizeof("soapaction"), (void**)&tmp) == SUCCESS && - Z_TYPE_PP(tmp) == IS_STRING) { - soap_action = Z_STRVAL_PP(tmp); - } + if (zend_hash_find(ht, "soapaction", sizeof("soapaction"), (void**)&tmp) == SUCCESS && + Z_TYPE_PP(tmp) == IS_STRING) { + soap_action = Z_STRVAL_PP(tmp); + } - if (zend_hash_find(ht, "uri", sizeof("uri"), (void**)&tmp) == SUCCESS && - Z_TYPE_PP(tmp) == IS_STRING) { - uri = Z_STRVAL_PP(tmp); + if (zend_hash_find(ht, "uri", sizeof("uri"), (void**)&tmp) == SUCCESS && + Z_TYPE_PP(tmp) == IS_STRING) { + uri = Z_STRVAL_PP(tmp); + } + } else if (Z_TYPE_P(options) != IS_NULL) { + php_error_docref(NULL TSRMLS_CC, E_ERROR, "first parameter must be string or null"); } } @@ -3035,8 +3058,7 @@ PHP_METHOD(SoapClient, __call) Z_ADDREF_P(headers); free_soap_headers = 1; } else{ - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid SOAP header"); - return; + php_error_docref(NULL TSRMLS_CC, E_ERROR, "Invalid SOAP header"); } /* Add default headers */ @@ -3237,7 +3259,7 @@ PHP_METHOD(SoapClient, __doRequest) &location, &location_size, &action, &action_size, &version, &one_way) == FAILURE) { - return; + php_error_docref(NULL TSRMLS_CC, E_ERROR, "Invalid parameters"); } if (SOAP_GLOBAL(features) & SOAP_WAIT_ONE_WAY_CALLS) { one_way = 0; @@ -3263,11 +3285,13 @@ PHP_METHOD(SoapClient, __setCookie) { char *name; char *val = NULL; - int name_len, val_len = 0; + int name_len, val_len; zval **cookies; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|s", &name, &name_len, &val, &val_len) == FAILURE) { - return; + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|s", + &name, &name_len, &val, &val_len) == FAILURE) { + php_error_docref(NULL TSRMLS_CC, E_ERROR, "Invalid parameters"); + RETURN_NULL(); } if (val == NULL) { @@ -3302,7 +3326,8 @@ PHP_METHOD(SoapClient, __setSoapHeaders) zval *headers = NULL; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|z", &headers) == FAILURE) { - return; + php_error_docref(NULL TSRMLS_CC, E_ERROR, "Invalid parameters"); + RETURN_NULL(); } if (headers == NULL || Z_TYPE_P(headers) == IS_NULL) { @@ -3324,7 +3349,7 @@ PHP_METHOD(SoapClient, __setSoapHeaders) Z_DELREF_P(default_headers); add_property_zval(this_ptr, "__default_headers", default_headers); } else{ - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid SOAP header"); + php_error_docref(NULL TSRMLS_CC, E_ERROR, "Invalid SOAP header"); } RETURN_TRUE; } @@ -3341,19 +3366,20 @@ PHP_METHOD(SoapClient, __setSoapHeaders) PHP_METHOD(SoapClient, __setLocation) { char *location = NULL; - int location_len = 0; + int location_len; zval **tmp; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s", &location, &location_len) == FAILURE) { - return; + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s", + &location, &location_len) == FAILURE) { + php_error_docref(NULL TSRMLS_CC, E_ERROR, "Invalid parameters"); + RETURN_NULL(); } - - if (zend_hash_find(Z_OBJPROP_P(this_ptr), "location", sizeof("location"),(void **) &tmp) == SUCCESS && Z_TYPE_PP(tmp) == IS_STRING) { - RETVAL_STRINGL(Z_STRVAL_PP(tmp), Z_STRLEN_PP(tmp), 1); + if (zend_hash_find(Z_OBJPROP_P(this_ptr), "location", sizeof("location"),(void **) &tmp) == SUCCESS && + Z_TYPE_PP(tmp) == IS_STRING) { + RETVAL_STRINGL(Z_STRVAL_PP(tmp), Z_STRLEN_PP(tmp), 1); } else { RETVAL_NULL(); } - if (location && location_len) { add_property_stringl(this_ptr, "location", location, location_len, 1); } else { |