SOAP-ERROR: Encoding: Violation of encoding rules

Mephistophel

Новичок
SOAP-ERROR: Encoding: Violation of encoding rules

Приветствую.
Имеется проблема с использванием SOAP extension. Есть агент у Lotus сервера, который работает как soap сервер.
Вот тут его wsdl.
С ним из php с использованием класса SoapClient (из экстеншна) нормально работается за исключением случаев, когда вызывается CURRENTUSERTASKS(). (см. wsdl).
В этом случае скрипт валится с Fatal error: SOAP-ERROR: Encoding: Violation of encoding rules. Если использовать NuSoap клиент, все отрабатывает нормально.
Кто-нибудь сталкивался?
--------------------------------
PHP 5.2.1, FreeBSD 5.4-RELEASE-p8, Apache/2.2.4
 

Alexandre

PHPПенсионер
В SOAP extension проблемы с символами, которые лежат за пределами ASCII.
 

Mephistophel

Новичок
хм. ну ok, попробую выяснить, в этом ли проблема в моем случае, спасибо.
 

Alexandre

PHPПенсионер
ну ok, попробую выяснить, в этом ли проблема в моем случае
Mephistophelну и отправь сообщение без символа... и с символом... или сделай замену...

Ну и потомкам хотелось бы народу услышать результаты твоих изысканий, а то тема была а результата нет
 

Mephistophel

Новичок
Автор оригинала: Alexandre
Ну и потомкам хотелось бы народу услышать результаты твоих изысканий, а то тема была а результата нет.
Пришлось на время отложить эту штуку. Планирую еще вечером поколупаться. Как только у меня будет удобоваримое объяснение, я отпишу, чтобы тема без результата не осталась.

-~{}~ 04.04.07 14:35:

В общем, так, проблема нашлась. И заключается она в том, что в тип double у лотуса разделителем является ЗАПЯТАЯ.
Смотрим, как парсятся типы в soap extension: soap_encoding.c Смотрим там, как работает to_zval_double():
Код:
switch (is_numeric_string((char*)data->children->content, strlen((char*)data->children->content), &lval, &dval, 0)) {
	case IS_LONG:
		Z_TYPE_P(ret) = IS_DOUBLE;
		Z_DVAL_P(ret) = lval;
		break;
	case IS_DOUBLE:
		Z_TYPE_P(ret) = IS_DOUBLE;
		Z_DVAL_P(ret) = dval;
		break;
	default:
		soap_error0(E_ERROR, "Encoding: Violation of encoding rules");
}
Вот где генерится наш фатал. Смотрим, как работает is_numeric_string():
zend_operators.h
и видим, что запятая в качестве разделителя для double использоваться не может.

Собственно, в исходники php можно было и не лезть, но уж больно досадная проблема была.
 
Сверху