HTTP 断点续传响应兼容问题

(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 能否代替分段加载?

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值