gpt4 book ai didi

node.js - Firefox 在收到具有指定内容范围的 206 后不会请求进一步的数据

转载 作者:搜寻专家 更新时间:2023-11-01 00:06:55 24 4
gpt4 key购买 nike

为了提供一些背景信息,我有一个 <video>具有 src 的标签指向我的 node.js 服务器上的方法的属性。该方法得到一个 mp4来自另一台服务器的文件,或者更确切地说是 mp4一部分文件,取决于 Range浏览器指定的 HTTP header ,例如 - Range:bytes=0- .

预期行为(Chrome 行为)

为了防止我的 node.js 服务器从第三方服务器下载整个文件,我实现了一次下载大约 5MB 的最大缓冲区。因此,如果用户发送请求以获取带有 header 的视频

GET /play-test/videoId HTTP/1.1
Host: 127.0.0.1:8000
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
Accept-Encoding: identity;q=1, *;q=0
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36
Accept: */*
Referer: http://127.0.0.1:8000/movie/99861
Accept-Language: en-US,en;q=0.8,es;q=0.6
Range: bytes=0-

..然后我的服务器将响应

HTTP/1.1 206 Partial Content
X-Powered-By: Express
Content-Range: bytes 0-5000000/415473786
Connection: keep-alive
Accept-Ranges: bytes
Content-Length: 5000001
Content-Type: video/mp4
Date: Tue, 20 Oct 2015 12:50:42 GMT

我相信,这是一个足够常见的模式 - 尽管客户端(在本例中为浏览器)已请求已请求 bytes=0- (从头到尾),我改为使用前 5MB 进行响应,最重要的是告诉客户响应仅包含总共 415MB ( Content-Range: bytes 0-5000000/415473786 ) 中的那 5MB。响应的状态也是 206表示响应是部分响应。

在 Chrome 中,这按预期工作 - 就在视频播放完前 5MB 视频之前,它向同一端点发出另一个请求,但带有 header

GET /play-test/videoId HTTP/1.1
Host: 127.0.0.1:8000
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
Accept-Encoding: identity;q=1, *;q=0
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36
Accept: */*
Referer: http://127.0.0.1:8000/movie/99861
Accept-Language: en-US,en;q=0.8,es;q=0.6
Range: bytes=5000001-

我再次以最大 5MB 响应...

HTTP/1.1 206 Partial Content
X-Powered-By: Express
Content-Range: bytes 5000001-10000001/415473786
Connection: keep-alive
Accept-Ranges: bytes
Content-Length: 5000001
Content-Type: video/mp4
Date: Tue, 20 Oct 2015 12:51:08 GMT

这种模式一直持续到视频结束,用户使用搜索栏暂停或跳过,在这种情况下,浏览器会请求所需时间的特定字节范围。正如我所说,一切都在 Chrome 中运行良好。

Firefox 行为

描述 Firefox 的行为比描述正确的行为要直接得多!

Firefox 请求

Host: 127.0.0.1:8000
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:41.0) Gecko/20100101 Firefox/41.0
Accept: video/webm,video/ogg,video/*;q=0.9,application/ogg;q=0.7,audio/*;q=0.6,*/*;q=0.5
Accept-Language: en-US,en;q=0.5
Range: bytes=0-
Referer: http://127.0.0.1:8000/movie/272
Connection: keep-alive

响应

206 Partial Content
Accept-Ranges: bytes
Connection: keep-alive
Content-Length: 5000001
Content-Range: bytes 0-5000000/415473786
Content-Type: video/mp4
Date: Tue, 20 Oct 2015 13:15:49 GMT
X-Powered-By: Express

就是这样 - Firefox 播放前 5MB 的视频并且不再向服务器发出进一步的请求。搜索栏显示视频的正确持续时间,但搜索栏不起作用。当用户尝试寻找视频时,会跳回开头并再次播放前 5MB。

如有任何帮助,我们将不胜感激。

最佳答案

the client (in this case, the browser) has requested has requested bytes=0- (start to end), I have instead responded with the first 5MB

我认为这就是您的问题所在。规范规定,当客户端请求 0- 范围时,您应该返回整个可用字节范围。您没有遵循规范,因此它不起作用。

关于node.js - Firefox 在收到具有指定内容范围的 206 后不会请求进一步的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33237902/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com