AssetsManager遇到“416 Requested Range Not Satisfiable”错误

发现断点续传会增加文件大小。
比如1G的zip更新包。(更新内容只有这一个zip包)

  1. 第一次进,下到500M。
  2. 重启游戏,会从50%继续下,但zip大小增加到1.5G(500M+1G)才到100%,并且可以解压成功。
  3. 如果在2过程中再次重启游戏,比如zip大小是1.2G的时候,那么再次启动,请求的range就超出了1G,服务器就报416.

基于cocos2d-x 3.12的热更代码。最新lite-1.4版本的没测,因为1.4上如果一个zip包没下完,重进后,会直接认为更新成功,无法进一步测试。

经进一步测试,上述情况是服务器不支持断点续传导致(本地测试环境)。如果支持断点续传,zip大小不会增加的比原始文件大。
但正式上线服务器是支持断点续传的,仍然会有偶发性416错误,还没发现规律。
看到3.11有一个PR是关于416错误的,https://github.com/cocos2d/cocos2d-x/issues/15634 但是相关的改动3.12都包含了,还是会出问题。
里面提到了用RangeFileAsyncHttpResponseHandler替代FileAsyncHttpResponseHandler,里面有关于416的处理。引擎组有考虑过么?

我看了一下他的方案,他会忽略 416 错误,并直接认为文件是下载成功的。然而当发生 416 错误的时候,文件大小和实际大小已经不符了,所以我们不能认为这个文件是正常的,必须返回错误

@panda 提供进一步的信息:
我们给线上游戏加入了异常统计。发现416错误基本都发生在下载version.manifest.tmp这个文件时。
version.manifest.tmp的内容为:

<html><head><title>404NotFound</title></head><bodybgcolor="white"><center><h1>404NotFound</h1></center><hr><center>nginx</center></body></html><html><head><title>404NotFound</title></head><bodybgcolor="white"><center><h1>404NotFound</h1></center><hr><center>nginx</center></body></html><html><head><title>404NotFound</title></head><bodybgcolor="white"><center><h1>404NotFound</h1></center><hr><center>nginx</center></body></html><html><head><title>404NotFound</title></head><bodybgcolor="white"><center><h1>404NotFound</h1></center><hr><center>nginx</center></body></html><html><head><title>416RequestedRangeNotSatisfiable</title></head><bodybgcolor="white"><center><h1>416RequestedRangeNotSatisfiable</h1></center><hr><center>nginx</center></body></html><html><head><title>416RequestedRangeNotSatisfiable</title></head><bodybgcolor="white"><center><h1>416RequestedRangeNotSatisfiable</h1></center><hr><center>nginx</center></body></html>

这是一个很小的文件,只有439字节,按道理不需要续传的。

cocos的热更变化太大了,之前是用的跨平台libcurl库,自从3.9之后改为使用各个系统自带的下载库了, 这还得要踩很多坑才能完善。

这个问题最后跟踪的结果是,@sharyu 的服务器那边对 404 错误传回了一个 404 页面,这样的话,Downloader 会认为这个页面就是下载结果,并认为下载成功,保存到 version.manifest 中。

只要修改服务器配置就可以了,@sharyu 麻烦确认一下

@panda 经验证,确实是服务器配置问题,改为返回错误码后问题消失。

@panda,panda大好,我们也会遇到请求*.tmp的问题,不单是 version.manifest.tmp。我们请求是以单个文件为单位的。每个文件都很小,比如png,mp3等。。。如果tmp是断点续传的话,其实对于单个文件来说应该不需要,只有在请求大包zip的时候,可能会需要断点续传。

mark1