【问题标题】:Can I signal an error in HTTP after the data was downloaded?下载数据后,我可以在 HTTP 中发出错误信号吗?
【发布时间】:2021-12-13 06:39:41
【问题描述】:

我想要以下:

  • 通过 HTTP 将(可能很大的)文件流式传输到客户端,并且文件已经完全流式传输到客户端(可能)向客户端发出错误信号(例如 404 未找到或 500 内部服务器错误)。

在 HTTP 1.x 中这似乎是不可能的:错误在标头中发出信号,这些标头在正文之前流式传输。

也许,在 HTTP/2 中是可能的?怎么样?

我可以只是中断 HTTP TCP 连接,但在这种情况下,客户端可能会认为错误不是 404 或 500(在我的情况下,这意味着需要由客户端清除的错误文件内容)而是部分下载的文件,下次可能会尝试使用Range: 将更多数据附加到(不正确的)下载数据中。

我知道这可以通过创建我自己的文件格式来完成,但我想将文件按原样交付给客户端并使用 标准 HTTP 错误。

【问题讨论】:

  • 那是因为我通过校验和知道数据是否正确,校验和只能在流式传输完成后计算。
  • 如果校验和失败,我想中断当前的流并重新开始流,理想情况下客户端不做任何“自定义”,例如我可以使用发送到客户端的 HTTP 重定向(到相同的 URL?) 流式传输失败。
  • 也许可以在 TCP 级别重新流式传输?这可能是对 TCP 标准的一个很好的补充,但如果滥用它可能会增加网络负载......
  • ...还是不加。

标签: http tcp http2 false-positive http3


【解决方案1】:

我找到了部分解决方案:

开始第一次流式传输时,返回:

203 Non-Authoritative Information
...
Warning: 110 - "Response is Stale"
Expires: 0

203 Non-Authoritative Information
...
Warning: 111 - "Revalidation Failed"
Expires: 0

(应该是 110 还是 111?)

然后在我的缓存返回的后续流中

304 Not Modified
...

(到我的下游代理)如果没有校验和错误,或者只是从缓存中再次流式传输。

因此代理将向浏览器提供一些文档,在第一次尝试时指示它已过期,如果出现错误,则在第二次尝试时重新下载。

【讨论】:

    猜你喜欢
    • 2013-01-05
    • 1970-01-01
    • 2015-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-31
    • 2019-12-27
    相关资源
    最近更新 更多