HTTP 断点续传响应兼容问题

原创
2022/08/13 12:54
阅读数 88

(1)、断电续传时Content-Length的角色问题

有时,在部分请求中,断点续传如果给了Content-Length,那么Content-Length是代表总长度呢还是本次传输长度呢?

举例:

我们可以请求资源的某一部分。这次我们依然用 cURL 来进行测试。"-H" 选项可以在请求中追加一个首部行,在这个例子中,是用 Range 首部来请求图片文件的前 1024 个字节。

curl http://i.imgur.com/z4d4kWk.jpg -i -H "Range: bytes=0-1023"
Copy to Clipboard

这样生成的请求如下:

GET /z4d4kWk.jpg HTTP/1.1
Host: i.imgur.com
Range: bytes=0-1023
Copy to Clipboard

服务器端会返回状态码为 206 Partial Content 的响应:

HTTP/1.1 206 Partial Content
Content-Range: bytes 0-1023/146515
Content-Length: 1024
...
(binary content)
Copy to Clipboard

在这里,Content-Length 首部现在用来表示先前请求范围的大小(而不是整张图片的大小)。Content-Range 响应首部则表示这一部分内容在整个资源中所处的位置。

(2)资源长度未知问题

有时候资源长度分片且未知,这个时候的响应头如何构造呢,实际上,Http允许我们传输未知长度的请求

// format is "bytes xxx-yyy/zzz
// where "zzz" is the total number of bytes of the
// content or '*' if unknown.

但是更具体的标准规范如下

Content-Range: <unit> <range-start>-<range-end>/<size>
Content-Range: <unit> <range-start>-<range-end>/*
Content-Range: <unit> */<size>

但是我们发现,其中一个缺陷,要么“/”前面可以使用“*”,要么是后面,但是对于连range-end都不能确定的情况,总不能是 "*/*"吧?这种情况我们建议使用固定常量

const MAX_OUPUT_RANGE = 8*1024*8; //64KB

Content-Range: <unit> <range-start>-(<range-start> + MAX_OUTPUT_RANGE)/*

(3) Content-Type:multipart/byteranges 能否代替分段加载?

事实上这种分段下载是同一次请求发起的,一次返回,并不能代替分段加载,另外很多解析库不支持

展开阅读全文
加载中

作者的其它热门文章

打赏
0
0 收藏
分享
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部