使用内容编码的Guzzle响应:gzip返回错误的内容长度标题

时间:2016-07-21 20:33:52

标签: php json gzip guzzle content-length

我有一个symfony2应用程序,我使用Guzzle http客户端向服务器发送GET请求以检索json文件的内容。 Guzzle响应被转换为对浏览器的Symfony2响应。

Guzzle的回复带有以下标题:

内容编码:gzip 内容长度:2255 Content-Type:application / json

当输出数据到UI /浏览器时,我注意到它被切断了,因为Content-Length不正确。文件的大小更接近4905字节,而不是2255. 2255是到截止点的数据的确切长度。我怀疑2255是gzip压缩数据的大小,在某些时候它会被解压缩而不更新内容长度。现在我确实验证了我得到了所有数据,但是内容长度标题很受尊重,这就是为什么当我将数据转发到浏览器时数据被切断的原因。有趣的是,即使内容长度为2255,即使内容长度为2255,直接点击文件也会忽略json文件中的url直接产生完整内容。如果我使用POSTman REST客户端发出GET请求,则显示相同的内容。

默认情况下,Guzzle有一个请求选项decode_content = true,用于处理响应的方式。我在提交请求时将其设置为false,但似乎无法解决问题。

在将Guzzle响应转换为Symfony响应之前,我删除了内容长度标头,这似乎解决了问题但是我不确定这是最好的方法,因为RFC协议声明应该存在内容长度标头,除非存在transfer-encoding标头,但它不存在。 https://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html

另一个替代方案是,因为这是一个流式响应,要获取流的大小并更正内容长度,但是Guzzle实现使用strlen(),这会产生读取整个流的不良影响。 / p>

如果我选择省略内容长度标题,可能会遇到哪些问题?或者,有没有办法获得内容的TRUE长度而不读取整个流,只需用正确的数量更新内容长度标题?

0 个答案:

没有答案