Есть форма с <textarea name="smp"></textarea>. При отправке формы в обработчик приходят искореженные данные. Причем данные корежатся в какой-то зависимости от пробельных символов в самих данных.
Например.
Случай 1 Отправляю этот текст (с табуляциями в начале строк):
т.е. <div class="errors"></div> заменился на такую гадость div>"></div>"></div>"></div>, а <label>Пароль</label> заменился на </label>Пароль</label>
С чем это все может быть связано? Как побороть? ОС: Ubuntu 10.04, 32-битная. Парсер: 3.4.0. Парсерный скрипт пробовал и из убунтовского репозитария и с этого сайта (parser3_4_0_debian5_cgi_xml.tar.gz).
Явно в $form:text попадает не то, что должно бы. Файрбаг показывает что скрипту отправляется то, что нужно. А вот в серверной стороне уже бяка.
Если в указанных данных в начале строк табуляцию заменяю на пробелы, то приходит нормально без искажений. Если табуляции или сочетание табуляций и пробелов, то все также приходят или покореженные или обрезанные данные, или и то и другое вместе.
Смена method=get/post ошибку не исправляет. enctype ошибку не исправляет. Раньше думал, что если табуляции заменить на пробелы, то исправляется, оказывается что и это не исправляет.
вариант 2 (если можете попробовать собрать парсер сами): в parser3.C в SAPI::read_post в конце можно попробовать или записать считанное у веб сервера в файл или тупо throw его.
вариант 3 (вообще исключаем parser): в качестве action указать какой-нить action.pl, в котором принять данные и сохранить в файл.
ОС: Ubuntu 10.04, 32-битная. Парсер: 3.4.0. Парсерный скрипт пробовал и из убунтовского репозитария и с этого сайта (parser3_4_0_debian5_cgi_xml.tar.gz).
2zobzn: а если UTF-8 поменять на Windows-1251? И какие кодировки заданы у парсера в cgi/auto.p?
Уже писал, все в utf-8 - и в auto.p и все .html файлы. Перекодировка в windows-1251 ничего не поменяла. В $request:body все ок, в $form:text - искажения.
в $request:body все OK -- значит от веб сервера данные нормально получены.
в некоторых местах у вас символы преобразуются в &#xxxxx;. я вижу только одно место в парсерном коде, где такое преобразование может произойти -- в transcode из utf-8 в однобайтную кодировку (напр. 1251). но transcode начинает работать только если кодировки не совпадают. как такое может быть в вашем случае -- я не очень понимаю.
предлагаю ещё немного поковыряться с тестовым файлом:
Не, испорченный символ не в виде ентити, а как какой-то битый символ показывается. Он заменился на ентити при вставке в сообщения на этот форум. Вот как это выглядит в браузере
И плюс на скрине результат вывода кодировок. В разных браузерах результат одинаковый.
попробуйте переименовать все auto.p (например в "auto.p-"), чтобы для этого тестового файла не выполнялось вообще ничего, кроме него самого.
если кодировка не задана, то это равносильно UTF-8, но, чтобы браузер нормально показал страницу, укажите в приведённом ранее @postprocess (в тестовом файле):
ещё, если возможно, покажите результаты HEAD запроса к этой тестовой странице (без post) например из telnet-а (вдруг тут что-нить необычное будет видно):
telnet zbz 80<enter>
HEAD / HTTP/1.1<enter>
Host: zbz<два раза enter>
Все auto.p переименовал, в @postprocess $response:content-type добавил. Единственное, что изменилось - $response:content-type.charset теперь '' вместо 'UTF-8'. Ошибки остались.
nc zbz 80 выдает:
HTTP/1.1 200 OK
Date: Wed, 26 May 2010 08:30:58 GMT
Server: Apache/2.2.14 (Ubuntu)
Content-Length: 418
Connection: close
Content-Type: text/html; charset=UTF-8
предлагаю попробовать собрать бинарник самому. возможно это не доставит проблем. надо скачать исходники, распаковать их как написано в доке и запустить ./buildall-with-xml
В request.txt все OK, а в form.txt - битые данные, то это действительно полная мистика. У меня проблема не повторяется. Что может быть у вас - сложно сказать, возможности удаленной диагностики исчерпаны. Так что боюсь только при наличии ssh доступа можно будет в отладчике посмотреть, что именно идет не так.
Сборка парсера не помогла. Ни 3.4.0 ни HEAD версия. Все равно те же самые битые данные. Тогда к следующей неделе попробую организовать ssh доступ. Мне нужно еще что-то дополнительно установить, что может понадобиться при дебаге?
9 лет висело ружье на стене (судя по CVS с 1.72 от 16-Oct-01)
Проблема есть, есть и решение. Интересно, что вылезло это только на конкретной конфигурации - получается во всех остальных системных библиотеках используется реализация memcpy, которой не принциально пересечение областей. Но потенциально может вылезти где угодно и когда угодно. :( На остальные memcpy в коде тоже посмотрим.
man memcpy:
The memcpy() function copies n bytes from memory area src to memory area dest. The memory areas should not overlap. Use memmove(3) if the memory areas do overlap.