12

在编写我的 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!!!

我的服务器应如何处理此类请求?

4

1 回答 1

14

我刚刚查看了支持Range标头字段的其他服务器如何响应并快速浏览curlexample.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响应标头。谷歌搜索正好找到了一个带有 RFC 2616 附录的 W3C 文档

当 HTTP 206(部分内容)响应消息包含多个范围的内容(对多个非重叠范​​围的请求的响应)时,这些内容将作为多部分消息体传输。用于此目的的媒体类型称为“ multipart/byteranges”。媒体类型包括两个或多个部分,每个部分都有自己的
和字段。必需的边界参数指定用于分隔每个正文部分的边界字符串。multipart/byterangesContent-TypeContent-Range

所以你去。

顺便说一句,example.com上的服务器不会检查重叠的字节范围,而是准确地向您发送您请求的范围......

于 2013-08-21T15:50:43.537 回答