HTTP/1.1 响应多个范围

Posted

技术标签:

【中文标题】HTTP/1.1 响应多个范围【英文标题】:HTTP/1.1 response to multiple range 【发布时间】:2013-08-19 14:03:24 【问题描述】:

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

我刚刚查看了支持 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-TypeContent-Range 字段。必需的边界参数指定用于分隔每个正文部分的边界字符串。

所以你去。

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

【讨论】:

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

以上是关于HTTP/1.1 响应多个范围的主要内容,如果未能解决你的问题,请参考以下文章

HTTP 1.1 GET 请求太快,服务器无法响应,导致 TCP 重传

HTTP/1.1与HTTP/1.0的区别

`HTTP/1.1` 响应返回 HTTP 状态代码 `421 Misdirected Request` 是不是有意义?

http1.0http1.1和http2.0的区别

如何避免来自 LinkedIn 的“HTTP/1.1 999 Request denied”响应?

前端01.http协议回顾