【问题标题】:Can the server respond with content-length less than requested range if proper headers are used如果使用正确的标头,服务器能否以小于请求范围的内容长度响应
【发布时间】:2022-01-24 07:08:32
【问题描述】:

我正在开发一个带有一些自定义视频流行为的 Node-JS 服务器。

服务器将文件公开为根路径localhost:3000/ 上的流并侦听范围请求。在前端有一个 html5 视频播放器,我通过记录注意到,当您在时间轴上擦洗时,从范围值 current-byte to total-bytes 请求。

现在我只是将文件流传送到响应中。

我的方案要求我查询有关文件的另一个进程,并且只向下传输它允许我访问的文件部分。现在我的问题是,如果播放器请求例如从字节 0 到 1000 并且我以 0 到 100 响应并且我设置如下标题,播放器是否会理解它没有获得所需的完整数据并发出任何后续请求。

 const range = fromOtherProcess(); // the other process told me this range is allowed
 response.statusCode = 206; // parital content
 response.setHeader('Content-Length', range.end - range.start + 1);
 response.setHeader('Content-Range', 'bytes ' + range.start + '-' + range.end + '/' + size);

【问题讨论】:

    标签: javascript node.js http html5-video


    【解决方案1】:

    如果你不能满足请求的范围,你想用 416 响应,并包含一个 Content-Range 标头,告诉客户端实际可满足的范围是什么。见

    https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/416

    如果您真的要自己处理范围请求,您可能需要阅读 RFC。您需要优雅地处理格式错误的请求、未知单位、多个范围等。我上面链接的页面有一个指向当前 RFC 的链接。

    【讨论】:

    • 好吧,听起来不错。关于问题的第二部分的任何内容。 HTML5 视频标签在这种情况下如何表现。它会像正常一样接受响应并播放吗?当它到达部分响应的末尾时。它会自动发出一个新的请求 from: new_starting_byte to:end_byte
    • 你的意思是如果你发回你描述的响应,而不是 416,浏览器将如何响应?
    • 我的意思是,如果我确实发送了 416 和部分内容,浏览器(视频播放器)会在消耗完之后停止请求更多内容,还是会发出后续请求。
    • 除了 Content-Range 标头之外不要发回任何东西,然后浏览器(或任何表现良好的客户端)应该发送一个新的可用字节请求。
    猜你喜欢
    • 2019-12-13
    • 2023-03-08
    • 1970-01-01
    • 2015-01-29
    • 2015-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    相关资源
    最近更新 更多