May 07 2008
Problemas con nuSOAP y PHP5
NuSOAP es un proyecto Open Source que permite conexiones SOAP mediante PHP de forma fácil. Desde las últimas versiones, Moodle incorpora ésta librería para la Moodle Network y es una parte imprescindible de los Webservices.
Durante el proceso programación de los conectores nos hemos encontrado con que el NuSOAP que viene dentro de Moodle no funciona correctamente con PHP5 en algunos niveles de debugación.
Todos estos errores se deben a que PHP5 es bastante más restrictivo con lo tipos de datos que PHP4 (recordemos Moodle 2.0 será el primero que exigirá PHP5). De hecho, dos de los tres cambios consisten simplemente en eliminar una concatenación de String+Array en una variable de debugación interna de NuSOAP.
Todos los cambios afectan al archivo “/lib/soap/nusoap.php” dentro de la raíz de Moodle.
Primer Cambio
La primera corrección consiste en comprobar el tipo de dato antes de operar con él. Para ello se añadirá código encima de la línea 3609. El contenido original es el siguiente (la línea especificada está en cursiva):
…$call_arg = array(&$instance, $method);
}
$this->methodreturn = call_user_func_array($call_arg, array_values($this->methodparams));
}
$this->debug(’in invoke_method, methodreturn:’);…
La línea a añadir es:
if (!is_array($this->methodparams)) $this->methodparams = array($this->methodparams);
Y el código queda:
…$call_arg = array(&$instance, $method);
}
if (!is_array($this->methodparams)) $this->methodparams = array($this->methodparams);
$this->methodreturn = call_user_func_array($call_arg, array_values($this->methodparams));
}
$this->debug(’in invoke_method, methodreturn:’);…
Segundo Cambio
El segundo se encuentra en la línia 3613 del código original. El cambio simplemente es quitar una concatenación del debug de NuSOAP. El original es (la parte a eliminar está en rallada):
…$this->debug(’in invoke_method, methodreturn:’);
$this->appendDebug($this->varDump($this->methodreturn));
$this->debug(”in invoke_method, called method $this->methodname, received $this->methodreturn of type “.gettype($this->methodreturn));…
Y el código queda:
…$this->debug(’in invoke_method, methodreturn:’);
$this->appendDebug($this->varDump($this->methodreturn));
$this->debug(”in invoke_method, called method $this->methodname, received of type “.gettype($this->methodreturn));…
Tercer Cambio
El tercer cambio es idéntico al anterior pero en la línea 5414, donde el código original es (la parte a eliminar está en rallado):
…$contents = ”;
foreach($value as $k => $v) {
$this->debug(”serializing array element: $k, $v of type: $typeDef[arrayType]“);
//if (strpos($typeDef[’arrayType’], ‘:’) ) {
if (!in_array(…
Donde el resultante es:
…$contents = ”;
foreach($value as $k => $v) {
$this->debug(”serializing array element: $k”);
//if (strpos($typeDef[’arrayType’], ‘:’) ) {
if (!in_array(…
Con estos tres cambios nos ha sido posible conectar los servicios de prueba que ya están implementados con un programa en pyhton 2.5. Sin embargo, es muy posible que los errores en el String de debug se repitan en otras partes del código.
