【问题标题】:Response to Partial Content, if size is unknown. Range request like "bytes=100-"对部分内容的响应,如果大小未知。范围请求,例如“bytes=100-”
【发布时间】:2016-03-10 22:47:30
【问题描述】:

如果我请求某个范围和未知的大小,Content-Range 看起来如何。

例如,我的请求是“bytes=100-200”,流将在 150 处结束。但在开始流之前我不知道。我应该将什么作为 Content-Range 标头发送?

bytes 100-/*
bytes 100-200/*
bytes 100-*/*

或者根本就不是法律情况?

如果请求是开放式的,同样的问题:“bytes=100-”

【问题讨论】:

    标签: http streaming


    【解决方案1】:

    如果您请求一个可满足的范围,服务器应该以 206(部分内容)响应进行响应。见RFC7233, sec. 4.1。

    如果请求资源的字节长度小于范围间隔的偏移量,或者关闭偏移量超出资源长度,服务器应该响应 416(范围不满足)。见section 4.4。

    要跳过内容的前 100 个字节,您确实是正确的,请求应该包含 Range: bytes=100- 标头。请参阅sec. 2.1 和sec. 3.1。

    就这种情况而言,资源的长度未知,并且正在以产生不可预测大小的内容块的方式读取:这是任何 RFC 都不认可的未定义行为。 Content-Range 标头以当前范围或总内容大小未知的方式指定,但不能同时未知。您不能使用 HTTP 信封来指定范围长度,因为服务器必须在响应 206 代码时提供 Content-Range 标头(参见 sec 4.1)。

    正确的处理方式是:

    1. 验证范围请求
    2. 尝试从请求的资源中读取足够数量的字节
    • 如果可以检索到足够数量的字节,请创建 HTTP 信封,指定范围并附加正文。必要时切断,
    • 在任何其他情况下:使用 416 回复

    【讨论】:

    • 如果流已经开始,则无法发送响应标头。如果请求 100-200,则无法设置 100-150。
    • @30thh:我已经更新了我的答案以反映这种情况。
    • 您确定“100-”是合法响应吗?
    • 第 2.1 节是关于请求的。它被指定为“第一个 - [最后一个]”。但是第 4.1 节将响应定义为“第一个 - 最后一个”。没有括号 => 非可选值 :-(
    • 是的,我也刚刚意识到这一点。你能暂时取消我的答案吗?
    猜你喜欢
    • 2015-08-03
    • 2015-08-18
    • 2019-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多