appengine、urlfetch及其内容长度头
我有一个在Google Appengine上运行的应用,它通过urllib2发送POST请求去获取另一个服务器的页面。最近,我在运行Apache2的那个服务器上启用了gzip压缩,结果Appengine的页面请求开始出现错误,提示“内容长度(content-length)”不在响应头中。
我在Appengine的请求中并没有明确声明gzip作为接受的编码方式,但有可能Appengine自动添加了这个头信息。网上搜索没有找到明确的说明,表明Appengine的urlfetch会自动添加接受gzip编码的头信息。
如果我没记错的话,Apache2在响应被压缩时会省略内容长度的头信息,但这不应该影响同一服务器上未压缩的响应。
有没有人能提供一些见解,为什么内容长度的头信息会被省略呢?
1 个回答
2
根据这个讨论串:http://groups.google.com/group/google-appengine-java/browse_thread/thread/5c5f2a7e2d2beadc?pli=1,在一个关于Appengine Java的讨论组里,谷歌通常会在urlfetch请求中设置一个叫做'Accept-Encoding: gzip'的头信息,然后在把数据交给脚本之前,会先把这些数据解压(也就是去掉压缩)。
所以,显然,Appengine在向互联网发送请求时,会自动添加一个accept-encoding: gzip的头信息,并且会解压返回的响应数据,但不会在解压后的数据大小中插入一个content-length的头信息。因此,如果外部服务器提供的是压缩过的响应,经过Appengine的这些处理后,最终传给Appengine脚本的数据就会缺少content-length这个头信息。