4

我正在使用 Apache Abdera 将 atom 多部分数据发布到我的服务器,并且遇到了一些我无法确定的奇怪问题。

这看起来像是分块传输编码的问题,但我没有足够的经验来确定。问题表现为服务器抛出错误,表明我发送的请求仅包含一个 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);“存款”参数只是一个包含原子部分和输入流的对象。

附加调试器时,我可以很好地执行这行代码,然后它消失在老鼠洞中,然后我又得到了这个错误。

任何提示或提示?我几乎用尽了我的攻击角度!

对我来说唯一突出的是,在 atom:entry 文档之后,只有一个带有“0”的换行符,这似乎是分块传输编码,代表“我完成了”。不知道它是如何到达那里的,或者它是否真的有任何影响。非常感谢帮助。

干杯,

理查德

4

1 回答 1

0

孤独0可能确实是个问题。我不知情的猜测是,它是由对 的某些调用导致的flush(),然后将整个缓冲区写入另一个 HTTP 块。不幸的是,在flush调用时,缓冲区已经被刷新,因此它的大小为零。因此,HttpChunkedOutputFilter应该教导(或无论如何调用它)而不需要刷新空缓冲区。

[更新:] 你应该在类中设置断点ChunkedOutputStream,尤其是flush方法。我只是查看了它的代码,似乎没问题,但也许我错过了一些东西。

于 2011-06-05T09:21:15.277 回答