一个遗留项目中增加下载刷机包功能,但下载下来的文件总是比服务器上大一倍左右,也无法正常使用,问题出在哪里呢?
本地 Proxy
为了方便与线上服务对接测试,本地启动的 server 拦截了所有 http 请求然后转发到指定的服务器。
对于 response 的处理, 将分块发送的数据进行了拼接,最后统一处理。
1 2 3 4 5 6 7 8 9
| var handler = function (response) { var reply = ""; response.on("data", function (chunk) { reply += chunk; }); response.on("end", function () { callback(response.statusCode, response.headers, reply); }); };
|
因为下载的内容为二进制文件,使用字符串方式的拼接显然是错误的,reply += chunk
的操作等同于 buffer.toString() + buffer.toString()
, 把二进制内容当做文本进行拼接,导致了最终内容远大于原始内容。
Chunk 正确拼接
经过调查发现有人遇到了类似的错误,解决方案也很简单,对于二进制文件采用 Buffer 来组合分块内容即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| var handler = function (response) { var chunks = []; var size = 0; response.on("data", function (chunk) { chunks.push(chunk); size += chunk.length; }); response.on("end", function () { var data = null; switch (chunks.length) { case 0: data = new Buffer(0); break; case 1: data = chunks[0]; break; default: data = new Buffer(size); for (var i = 0, pos = 0, l = chunks.length; i < l; i++) { var chunk = chunks[i]; chunk.copy(data, pos); pos += chunk.length; } break; } callback(response.statusCode, response.headers, data); }); };
|