在编写我的HTTP / 1.1服务器时,我遇到了处理多个范围请求的问题。
RFC 2616的第14.35.1节引用了一些示例,但没有说明服务器行为。 例如:
GET /some/resource HTTP/1.1
...
Range: bytes=200-400,100-300,500-600
...
我应该返回这个确切的字节序列吗?
或者我应该合并所有范围,发送100-400,500-600
?
或者在100-600
之间发送所有内容?
最糟糕的是,当检查Content-Range
响应头(第14.16节)时,可能只返回一个范围,所以我想知道服务器如何响应第14.35.1节bytes=0-0,-1
中的示例!
我的服务器应如何处理此类请求?
答案 0 :(得分:13)
我刚刚了解了支持Range
标头字段的其他服务器如何响应并快速curl
到example.com:
~# curl -s -D - -H "Range: bytes=100-200, 300-400" http://www.example.com
HTTP/1.1 206 Partial Content
Accept-Ranges: bytes
Content-Type: multipart/byteranges; boundary=3d6b6a416f9b5
Content-Length: 385
Server: ECS (fll/0761)
--3d6b6a416f9b5
Content-Type: text/html
Content-Range: bytes 100-200/1270
eta http-equiv="Content-type" content="text/html; charset=utf-8" />
<meta name="vieport" content
--3d6b6a416f9b5
Content-Type: text/html
Content-Range: bytes 300-400/1270
-color: #f0f0f2;
margin: 0;
padding: 0;
font-family: "Open Sans", "Helvetica
--3d6b6a416f9b5--
显然,您要查找的是Content-Type: multipart/byteranges; boundary
响应标头。谷歌搜索结果正好a W3C document with appendices to RFC 2616
当HTTP 206(部分内容)响应消息包括多个范围的内容(对多个非重叠范围的请求的响应)时,这些消息作为多部分消息体发送。用于此目的的媒体类型称为“
multipart/byteranges
”multipart/byteranges
媒体类型包含两个或多个部分,每个部分都有自己的Content-Type
和Content-Range
字段。必需的边界参数指定用于分隔每个正文部分的边界字符串。
所以你去吧。
顺便说一下,example.com的服务器不检查重叠的字节范围,并向您发送您请求的范围......