#2507·sanic

在使用 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