Sha*_*ais 5 php json gzip content-length guzzle
我有一个symfony2应用程序,其中我正在使用Guzzle http客户端向服务器发送GET请求,以便检索json文件的内容。Guzzle响应被转换为针对浏览器的Symfony2响应。
Guzzle响应返回以下标头:
内容编码:gzip内容长度:2255内容类型:application / json
将数据输出到UI /浏览器时,我注意到由于Content-Length不正确,该数据被切断了。文件的大小接近4905字节,而不是2255。2255是直到截止点为止的数据的确切长度。我怀疑2255是压缩数据的大小,并且在不更新内容长度的情况下在某些时候未压缩它。现在,我确实确认我已取回所有数据,但是荣幸地使用了内容长度标头,这就是为什么在将数据转发到浏览器时,数据会被切断的原因。有趣的是,即使内容长度为2255,点击json文件的url也会直接产生全部内容,这意味着Chrome直接点击文件时会忽略它。如果我使用POSTman REST客户端发出GET请求,则完全相同-显示全部内容。
默认情况下,Guzzle具有请求选项解码器内容= true,用于处理响应。我在提交请求时将其设置为false,但这似乎无法解决问题。
在将Guzzle响应转换为Symfony响应之前,我删除了content-length标头,这似乎可以解决问题,但是我不确定这是最好的方法,因为RFC协议规定除非传输编码,否则应该存在content-length标头标头存在,但不存在。https://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html
另一个选择是,由于这是流式响应,因此要获取流的大小并校正内容长度,但是Guzzle实现为此使用strlen(),这对读取整个流具有不良影响。
如果选择省略content-length标头,可能会遇到什么问题?或者,是否有一种方法可以在不读取整个流的情况下获取内容的TRUE长度,而仅以正确的数量更新content-length报头?