Я работаю с Apache mod_dav, скомпилированным на моем собственном сервере. Мой клиент — это созданный с нуля пользовательский код синтаксического анализа HTTP на Java. Я использую этот сервер и кодовую базу в течение многих лет, синхронизируя гигабайты данных на сервере.
Сегодня я столкнулся с проблемой, с которой раньше никогда не сталкивался: страшная ошибка SAX «контент не разрешен в завершающем разделе». При выполнении WebDAV PROPFIND по всему дереву ресурсов моего сервера я всегда получаю эту ошибку в одном и том же месте.
Я протестировал и перепроверил свой код синтаксического анализа HTTP, но он довольно прост: Apache отправляет обратно фрагментированный контент, и фрагменты указывают количество байтов, которые нужно использовать.
Место, где он терпит неудачу, - это ответ XML, который использует 110 фрагментов --- значительно больше, чем большинство других ответов (это очень большой каталог). Однако в моих журналах я вижу, что нет «завершающего содержимого» — каждый ответ XML (выдающий ошибку и не выдающий) заканчивается простым символом перевода строки.
Но еще более огорчительно: у меня есть входной поток, который анализирует фрагментированный контент HTTP и отправляет обратно простую строку байтов. Когда я передаю этот входной поток непосредственно анализатору XML, я получаю следующую ошибку. Однако: если я возьму тот же входной поток и возьму из него все байты, положу их в ByteArrayInputStream, а затем передам ByteArrayInputStream (который должен содержать точно такие же данные!) синтаксическому анализатору, нет возникает ошибка! Что за синтаксический анализ непосредственно из входящих данных, который вызывает ошибку?
Мой парсер XML довольно прост:
final DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
documentBuilderFactory.setNamespaceAware(true);
documentBuilderFactory.setValidating(false);
Кто-нибудь видел это раньше? (Я искал "mod_dav XML bug" --- и только что получил несвязанную ошибку Я подал заявку пять лет назад.)
Вот соответствующая часть трассировки стека:
Cause:org.xml.sax.SAXParseException: Content is not allowed in trailing section.
com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(Unknown Source)
com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(Unknown Source)
javax.xml.parsers.DocumentBuilder.parse(Unknown Source)
com.globalmentor.net.http.HTTPClientTCPConnection.readResponseBodyXML(HTTPClientTCPConnection.java:666)
com.globalmentor.net.http.webdav.WebDAVResource.propFind(WebDAVResource.java:453)
Обновление: я выполнял этот тест снова и снова. Наконец, я добавил код для обхода трассировки стека и вывода полученной информации о синтаксическом анализе SAX:
Public Id: null System Id: null Line# 21937 Column# 1
Я копирую XML из файла журнала, конечно же, строка 21937 - это конец файла --- но там ничего нет!!