На днях появилась задача разобраться в проблеме обмена данными по протоколу XML-RPC между Drupal сайтами.
Для понимания проблемы, введем терминологию.
Клиент - Drupal сайт, запрашивающий информацию с Сервера
Сервер - Drupal сайт, отвечает на запросы с Клиента
- Клиент отправляет запрос на Сервер по протоколу XML-RPC
- Сервер обрабатывает запрос и отправляет Клиенту ответ
- Клиент получает данные, не может выполнить обработку и выдает ошибку:
[http://example.ru/xmlrpc.php] Parse error for system.getCapabilities on http://example.ru/xmlrpc.php: xmlrpc specUrlhttp://www.xmlrpc.com/spec specVersion1 faults_interop specUrlhttp://xmlrpc-epi.sourceforge.net/specs/rfc.fault_codes.php specVersion20010516 system.multicall specUrlhttp://www.xmlrpc.com/discuss/msgReader$1208 specVersion1 introspection specUrlhttp://scripts.incutio.com/xmlrpc/introspection.html specVersion1. Failed to connect to the URL example.ru.
То есть парсер на стороне Клиента не смог обработать данные, так как они не соответствуют спецификации.
Первым делом надо проверить требования и проверить получаемые данные.
Обнаружил, что сервер в каждом ответе в начале шлёт спец.символ
Причина кроется в файловом редакторе. Вероятно программист правил на сайте файл php и сохранил его в Блокноте (операционная система Windows).
Поиск и удаление BOM в файлах сайта
Поиск файлов:
find . -name "*.php" | xargs grep -l $'\xEF\xBB\xBF' find . -name "*.inc" | xargs grep -l $'\xEF\xBB\xBF'
Открыть найденные файлы в редакторе Vim:
vi filename.php
Найти в файле спец.символ:
/fe или /EF
Удалить
Установить режим сохранения без bom:
:set nobomb
Сохранить файл и выйти
:wq
Выполнить пункты с другими найденными файлами
По завершению повторить обмен между Клиентом и Сервером.
Обновление
Периодически замечаем, что после поиска указанными выше командами, открываешь файл, а в нем спец.символы не подсвечиваются или вообще не отображаются.
Для большей уверенности в результатах, обновили команду:
grep -rnw --include=*.{module,inc,php} ./ -e $'\xEF\xBB\xBF'
В поиск добавили расширение ".module", что специфично для Drupal.
При выполнении этой команды выводится список найденных файлов и номер строки, где присутствует спец.символ BOM.
Успехов в поиске.