如何解决Apache Abdera的分块传输编码问题
| 我正在使用Apache Abdera将多部分数据发布到我的服务器上,并且遇到了一些我无法确定的奇怪问题。 分块传输编码看起来像是一个问题,但是我经验不足,无法确定。该问题表现为服务器抛出错误,该错误指示我发送给它的请求仅包含一个mime部分,而不是所需的两个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是标准Abdera MultipartRequestEntity类的副本,其中添加了一些额外的标题(例如,参见上面的代码段中的Packaging); \“ deposit \”参数只是一个包含原子部分和输入流的对象。
当连接调试器时,我可以很清楚地看到这行代码,然后消失在老鼠洞中,然后我又得到了这个错误。
有任何提示或提示吗?我已经筋疲力尽了!
对我来说唯一突出的是,在atom:entry文档之后,紧随其后的是一个换行符,上面带有\“ 0 \”,这似乎是分块的传输编码,表示\“我已经完成了\” 。不知道它如何到达那里,或者它是否真的有任何作用。帮助非常感谢。
干杯,
理查德
解决方法
孤独的“ 5”可能确实是个问题。我不知情的猜测是它是由对
flush()
的某些调用导致的,然后将整个缓冲区写为另一个HTTP块。不幸的是,在调用“ 7”时,缓冲区已经被刷新,因此其大小为零。因此,应该教导HttpChunkedOutputFilter
(或称其为“ 8”),因为不需要刷新空缓冲区。
[更新:]您应该在ChunkedOutputStream
类中设置断点,尤其是flush
方法。我只是看了一下它的代码,似乎还可以,但是也许我错过了一些东西。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。