在收到指定内容范围的206后,Firefox不会请求更多的数据
为了给出一些上下文,我有一个<video>
标签,它的src
属性指向了我的node.js服务器上的一个方法。 该方法从另一个服务器获取mp4
文件,或者是mp4
文件的一部分 ,具体取决于浏览器指定的Range
HTTP标头,例如: Range:bytes=0-
。
预期行为(Chrome行为)
为了防止我的node.js服务器从第三方服务器下载整个文件,我实现了一个大约5MB的最大缓冲区一次下载。 所以如果用户发送一个请求来获取带有标题的video
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-
( bytes=0-
),但是我已经用第一个5MB响应,最重要的是告诉客户端该响应只包含总共415MB( Content-Range: bytes 0-5000000/415473786
)中的Content-Range: bytes 0-5000000/415473786
。 响应也具有206
的状态,表示响应是部分响应。
在Chrome中,按预期工作 – 就在video播放完第一个5MBvideo之前,它向另一个端点发送另一个请求,
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
这种模式一直持续到video结束,用户暂停或跳过使用search栏,在这种情况下浏览器请求一个特定的字节范围所需的时间。 正如我所说,所有在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的video,并且不再向服务器发出进一步的请求。 search栏显示正确的video持续时间,但search栏不起作用。 当用户试图寻找video跳回到开始,再次播放第一个5MB。
任何帮助,将不胜感激。
客户端(在这种情况下,浏览器)已经请求已经请求了字节= 0-(从头到尾),而是用第一个5MB
我认为那是你的问题。 规范说,当客户端要求范围0-
时,应该返回整个可用的字节范围。 你没有遵循规范,所以它不起作用。
- 在Chrome和Firefox上,Socket.io无法向Node服务器发送消息
- CORS无法在Firefox中运行
- 将node.jsembedded到Firefox扩展中并在浏览器中运行服务器
- 如何获取Linux / Mac / Windows上的节点/电子应用程序中的浏览器活动标签URL?
- 在Firefox插件中使用Core NodeJs模块
- 为什么在{{} + 1`在Chrome和Firefox中获得数字1,而在Node.js中使用' 1'?
- JavaScript时区对于过去的夏令时转换规则是错误的
- 由于传输层/元/连接调用,使用faye / nodejs的firefox / chrome的长时间初始页面加载
- closures或刷新websockets的Firefox