Apache Abdera的分块传输编码问题

时间:2011-05-26 09:37:40

标签: http multipart atom-feed transfer-encoding apache-abdera

我正在使用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是标准Abdera MultipartRequestEntity类的副本,其中引入了一些额外的头文件(例如,参见上面代码片段中的Packaging); “deposit”参数只是一个包含原子部分和输入流的对象。

当附加调试器时,我可以很好地使用这行代码,然后它会消失在鼠洞中,然后我会收到此错误。

任何提示或提示?我的攻击角度几乎已经筋疲力尽了!

对我来说唯一突出的是,紧接在atom:entry文档之后,单独就有一个带有“0”的换行符,这似乎是分块转移编码,代表“我已经完成”。不确定它是如何到达那里的,或者它是否真的有任何影响。非常感谢。

干杯,

理查德

1 个答案:

答案 0 :(得分:0)

孤独的0可能确实是一个问题。我的不知情的猜测是它来自flush()的一些调用,然后将整个缓冲区写为另一个HTTP块。不幸的是,在调用flush时,缓冲区已经被刷新,因此其大小为零。所以应该教授HttpChunkedOutputFilter(或者它被称为),而不需要刷新空缓冲区。

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