在使用 file_stream() 时,范围请求会获得错误的数据
作者: jfyang2010创建于 2022年7月28日更新于 2026年9月12日
** 描述错误** 当 stream group files=True, app. static () 响应时, 当做一些范围要求时, 范围大小与块大小不匹配时, 数据比预期的要多 。 这是由于文件 steam(),一个固定显示如下.
** 代码片断** 与
从 sanic 导入 Sanic
app = sanic ("try") (中文(简体) ).
app.static ("/view"), “srv", 使用content range=True, stream 大文件=True)
app.run(host="0.0.0.0",端口=8000) 互联网档案馆的存檔,存档日期2013-12-20.卷起 - r 0- 5000 本地主机 : 8000/ view/ big. file \\ wc - c显示8192作为最终计数。
** 预期行为** 预计将有5001人。
** 重构和修复** 这是由于文件 streaming fn()中响应.py.
如下 diff 所示, buggy 代码读取了 ` min ( ( range. small, block small))' 字节,该字节是固定的, 在流圈中 。 将全读为:在结尾处得到一个空字符串是好的;而在范围请求中,它可能读取并返回更多横跨端边界.
将 QQrange. small 更改为“ to send ” 使错误固定 。
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你来干什么? ---应答.a.py 2022-07-28 19:03:48.575385670+0800
- 答复.b.py 2022-07-28 19:05:24.756010839+0800
正在等待 f.seek( range. start) 中 至 send = range. 大小 发送时( S) > ○:
- 内容 = 正在等待 f.read(min (( range. small, 块 small)))
- 内容 = 等待 f. read( min (to send, 块 大小)) 如果len(内容) < 1: 换行 至( S)-=len(内容)
** 环境(请提供下列资料):**
- 操作系统:Linux
- 版本:22.3.2内容来源: sanic-org/sanic