在收到指定内容范围的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-时,应该返回整个可用的字节范围。 你没有遵循规范,所以它不起作用。