2011-05-26 2 views
4

Я использую Apache Abdera для многофакторных данных POST atom на моем сервере, и у меня есть некоторые странные проблемы, которые я не могу зафиксировать.Проблема с кодировкой передачи пакетов с Apache Abdera

Похоже, что проблема связана с кодировкой с короткими передачами, но я недостаточно опытен, чтобы быть уверенным. Проблема проявляется в том, что сервер бросает ошибку, указывающую, что отправленный мной запрос содержит только одну часть mime, а не две, как требуется. Я приложил Wireshark к интерфейсу и захватил разговор, и он пошел, как это:

POST /sss/col-uri/2ee98ea1-f9ad-4f01-9b1c-cfa3c4a6dc3c HTTP/1.1 
Host: localhost 
Expect: 100-continue 
Transfer-Encoding: chunked 
Content-Type: multipart/related; boundary="1306399868259";type="application/atom+xml;type=entry" 

Ответ сервера:

HTTP/1.1 100 Continue 

Мой клиент продолжает:

198 
--1306399868259 
Content-Type: application/atom+xml;type=entry 
Content-Disposition: attachment; name="atom" 

<entry xmlns="http://www.w3.org/2005/Atom"><title xmlns="http://purl.org/dc/terms/">Richard Woz Ere</title><bibliographicCitation xmlns="http://purl.org/dc/terms/">this is my citation</bibliographicCitation><content type="application/zip" src="cid:48bd9436-e8b6-4f68-aa83-5c88eda52fd4" /></entry> 
0 

b0e9 

--1306399868259 
Content-Type: application/zip 
Content-Disposition: attachment; name="payload"; filename="example.zip" 
Content-ID: <48bd9436-e8b6-4f68-aa83-5c88eda52fd4> 
Packaging: http://purl.org/net/sword/package/SimpleZip 

И в этот момент на сервере отвечает:

HTTP/1.1 400 Bad Request 
Date: Thu, 26 May 2011 08:51:08 GMT 
Server: Apache/2.2.17 (Unix) mod_ssl/2.2.17 OpenSSL/0.9.8l DAV/2 mod_wsgi/3.3 Python/2.6.1 
Connection: close 
Transfer-Encoding: chunked 
Content-Type: text/xml 

Указание ошибки (что хорошо понятно). Мой сервер переводит кучу кодированных битов base64 в выходной поток, но в то же время сервер не прослушивает, он уже решил, что запрос был ошибочным.

К сожалению, я не отвечаю за уровень HTTP - это все обрабатывается Abdera с помощью Apache httpclient. Мой код, который делает это выглядит следующим образом:

client.execute("POST", url.toString(), new SWORDMultipartRequestEntity(deposit), options); 

Здесь SWORDMultipartRequestEntity является копией стандартного класса Абдеры MultipartRequestEntity, с несколькими дополнительными заголовками придачу (см, например, Упаковка в приведенном выше фрагменте кода); аргумент «депозит» - это просто объект, содержащий атомную часть и входной поток.

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

Какие-либо подсказки или подсказки? Я довольно сильно измучил свои углы атаки!

Единственное, что выделяется для меня, это то, что сразу после документа ввода атома: есть новая строка с «0» на нем в одиночку, которая, как представляется, является кодировкой передачи, говорит «Я закончен». Не знаете, как это произошло, или это действительно имеет какой-то эффект. Помощь очень ценится.

Приветствия,

Ричард

ответ

0

Одинокая 0 действительно может быть проблемой. Моя неосведомленная догадка заключается в том, что это результат некоторого вызова flush(), который затем записывает весь буфер как еще один фрагмент HTTP. К сожалению, в момент, когда вызывается flush, буфер уже был сброшен, и поэтому его размер равен нулю. Таким образом, следует обучать HttpChunkedOutputFilter (или, как бы там ни называлось), чем пустой буфер, который не нужно очищать.

[update:] Вы должны установить контрольную точку в классе ChunkedOutputStream, особенно метод flush. Я просто посмотрел на его код, и, похоже, все в порядке, но, возможно, я что-то пропустил.