HTTP/1.1响应多个范围的请求

13

当我编写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

我的服务器应该如何处理这样的请求?

1个回答

16

我刚刚查看了其他支持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。通过谷歌搜索确切的内容可以找到一份附录给RFC 2616的W3C文档
当HTTP 206(部分内容)响应消息包含多个范围的内容(对请求多个非重叠范围的响应)时,这些内容被传输为一个多部分消息体。此目的的媒体类型称为"multipart/byteranges"。
multipart/byteranges媒体类型包括两个或多个部分,每个部分都有自己的Content-TypeContent-Range字段。必需的边界参数指定用于分隔每个主体部分的边界字符串。
所以就是这样了。
顺便说一下,example.com服务器不检查重叠的字节范围,并向您发送您请求的确切范围...

你说到点子上了!我承认我没有尝试过,因为我担心它可能会导致一些特定于服务器的行为,而不是任何标准。谢谢! - LS_ᴅᴇᴠ
顺便问一下,发送多个单独范围的响应是否可以?另外,如@LS_ᴅᴇᴠ所问,发送所有范围的组合是否可以?即100-200、300-400、500-600 ==> 100-600? - iammilind
@iammilind,请看一下RFC 7233,其中定义了206部分内容响应状态码:“当请求多个范围时,服务器可能会合并任何重叠的范围,…”但您只能向一个请求发送一个响应。 - PoByBolek
谢谢。但是如果服务器不支持多个范围,只支持单个范围怎么办?另外,如果范围不重叠,服务器仍然可以发送任何客户端未请求的组合范围吗?我是从服务器实现的角度来问的。 - iammilind
@iammilind 仍然引用自RFC 7233,并且与之前相同的句子:“当请求多个范围时,服务器可以合并任何重叠的范围,或者由于发送多个部分的开销小于间隙而被分隔的范围,而不管相应的字节范围规范在接收到的范围头字段中出现的顺序如何。”如果您是从实现角度提问的,那么您应该真正阅读一下该RFC ;) - PoByBolek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接