2011-11-28 111 views
82

是否有可能向我演示范围请求的示例http会话。 我的意思是什么是请求和响应头?样本http范围请求会话

+2

几个月前新发布了HTTP/1.1标准版本。它有一个特殊的RFC范围请求,这是比旧规范更可读,包括许多项目的例子:https://tools.ietf.org/html/rfc7233 – Thirler

回答

128

以下是Chrome和静态Web服务器之间的交换,检索MP4视频。

初始请求 - 视频。注意Accept-Ranges响应头指示服务器范围头支持:在以前的响应

GET /BigBuckBunny_320x180.mp4 
     Cache-Control: max-age=0 
     Connection: keep-alive 
     Accept-Language: en-GB,en-US,en 
     Host: localhost:8080 
     Range: 
     Accept: text/html,application/xhtml+xml,application/xml,*/* 
     User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.7 ... 
     Accept-Encoding: gzip,deflate,sdch 
     Accept-Charset: ISO-8859-1,utf-8,* 
200 OK 
     Content-Type: video/mp4 
     Connection: keep-alive 
     Last-Modified: Wed,14 Dec 2011 15:50:59 GMT 
     ETag: A023EF02BD589BC472A2D6774EAE3C58 
     Transfer-Encoding: 
     Content-Length: 64657027 
     Accept-Ranges: bytes 
     Server: Brisket/1.0.1 
     Date: Wed,14 Dec 2011 16:11:24 GMT 

Range头检测 - 用开放式的范围内后续请求确认支持。响应返回206个状态和Content-Range头,以指示存在于所述响应体中的字节数:

GET /BigBuckBunny_320x180.mp4 
     Connection: keep-alive 
     Accept-Language: en-GB,en-US,en 
     Host: localhost:8080 
     Range: bytes=0- 
     Accept: */* 
     User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.7 ... 
     Referer: http://localhost:8080/BigBuckBunny_320x180.mp4 
     Accept-Encoding: identity 
     Accept-Charset: ISO-8859-1,utf-8,* 
206 Partial Content 
     Content-Type: video/mp4 
     Connection: keep-alive 
     Last-Modified: Wed,14 Dec 2011 15:50:59 GMT 
     ETag: A023EF02BD589BC472A2D6774EAE3C58 
     Transfer-Encoding: 
     Content-Length: 64657027 
     Accept-Ranges: bytes 
     Server: Brisket/1.0.1 
     Date: Wed,14 Dec 2011 16:11:25 GMT 
     Content-Range: bytes 0-64657026/64657027 

随后范围请求捕捉到文件的结尾(可能以捕获后的元数据):

GET /BigBuckBunny_320x180.mp4 
     Connection: keep-alive 
     Accept-Language: en-GB,en-US,en 
     Host: localhost:8080 
     Range: bytes=64312833-64657026 
     Accept: */* 
     If-Range: A023EF02BD589BC472A2D6774EAE3C58 
     User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.7 ... 
     Referer: http://localhost:8080/BigBuckBunny_320x180.mp4 
     Accept-Encoding: identity 
     Accept-Charset: ISO-8859-1,utf-8,* 
206 Partial Content 
     Content-Type: video/mp4 
     Connection: keep-alive 
     Last-Modified: Wed,14 Dec 2011 15:50:59 GMT 
     ETag: A023EF02BD589BC472A2D6774EAE3C58 
     Transfer-Encoding: 
     Content-Length: 344194 
     Accept-Ranges: bytes 
     Server: Brisket/1.0.1 
     Date: Wed,14 Dec 2011 16:11:25 GMT 
     Content-Range: bytes 64312833-64657026/64657027 

用户单击视频进度条超出下载范围 - 发出范围请求以从选定位置开始播放:

GET /BigBuckBunny_320x180.mp4 
     Connection: keep-alive 
     Accept-Language: en-GB,en-US,en 
     Host: localhost:8080 
     Range: bytes=1073152-64313343 
     Accept: */* 
     If-Range: A023EF02BD589BC472A2D6774EAE3C58 
     User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.7 ... 
     Referer: http://localhost:8080/BigBuckBunny_320x180.mp4 
     Accept-Encoding: identity 
     Accept-Charset: ISO-8859-1,utf-8,* 
206 Partial Content 
     Content-Type: video/mp4 
     Connection: keep-alive 
     Last-Modified: Wed,14 Dec 2011 15:50:59 GMT 
     ETag: A023EF02BD589BC472A2D6774EAE3C58 
     Transfer-Encoding: 
     Content-Length: 63240192 
     Accept-Ranges: bytes 
     Server: Brisket/1.0.1 
     Date: Wed,14 Dec 2011 16:11:25 GMT 
     Content-Range: bytes 1073152-64313343/64657027 
+7

空白的Transfer-Encoding标头是一个artefact HTTP通信被捕获的方式,还是有一个真正的HTTP服务器在那里生成这个头的空值? – swl10

+7

在第一种情况下,它看起来像服务器返回64657027字节的内容。所以发生了什么 - 客户只是丢掉那些内容,然后发出零件的范围请求真的想要?或者服务器没有返回任何内容,因为客户端消息中的某些内容表示不这么做。如果是这样,那是什么? – Morrie

+2

@Morrie - 它看起来像服务器,知道它本身支持范围请求,通过“Accept-Ranges:bytes”头告诉客户端“我接受范围请求”,但它也发送资源的内容长度,所以客户端可以使范围请求具有上限。就我所知,客户端消息中没有任何内容表示这么做 - 服务器可以选择以“这里是整个资源”或“我接受范围请求”作为响应 - 这又是“Accept-Ranges”头的存在。无论如何,这是我的理解。 –