在通过HTTP传输大型二进制文件时,出现HTTP错误代码?

4
我有一个Go服务器,可以读取并返回打包成tar的大型数据文件。我已经测试过它可以分段写入tar文件,当所有数据加载完成后,一切都很好。
问题是下载可能会出现意外错误。我目前会写入HTTP错误代码和错误消息,但错误消息只会放在流/文件的末尾。有没有一种好的方法来通知部分导出失败了?是否可以使用HTTP状态码并提供错误消息来实现这一点?
我正在使用以下curl命令:
curl --insecure https://127.0.0.1/api/export/030e28f3-4ab6-446a-852e-fda0a497ffe2 -o "test.tar"

我需要修改curl命令来检测错误吗?

2个回答

6
如果下载已经开始,那么所有HTTP头都已经发送到HTTP客户端。您无法再次重写状态代码(它在第一行)。
唯一能做的就是切断TCP/IP连接。如果您使用了Content-Length标头,则客户端将看到传输不完整。如果您使用Transfer-Encoding: chunked,则客户端将看到未接收到块结束标记。在所有情况下,这将使整个传输无效。
您可以尝试使用范围请求和部分内容响应,并在几个HTTP请求-响应对话框中发送内容。但是,如果您通过单个HTTP对话框管理大型文件传输,则唯一能做的就是中断传输并重新启动。
通常,大型文件传输以块为单位在应用程序层上进行管理,在HTTP之上。例如,在上传的情况下,JavaScript会将文件分成块,并将其发送回专用应用程序服务器,使用HTTP之上的专用协议重建文件,以请求缺失的块。这是因为在现实生活中,长时间传输很难处理,并且所有潜在代理的范围/部分内容传输都不能很好地管理。另一方面,使用简单的中等大小的HTTP请求几乎可以在任何地方工作。因此,如果您控制客户端和服务器端,则可以在HTTP之上构建自己的对话框,并使用良好的错误管理制定自己的分块传输协议。

如果使用HTTP/2或HTTP/3,这是否仍然成立? - Alexis Wilke
我不是HTTP/2和HTTP/3的专家,但似乎先发送头文件的概念仍然存在。也许对于大文件传输有一些新的东西,比如自动MD5控制。但我仍然觉得使用应用层算法更安全,而不是期望HTTP层在大数据传输中推送错误。例如,使用第二个通道来传递有关当前传输的信息。 - regilero

1

这对我来说很新鲜!有人在HTTP/1.1中添加了那个功能很有意思。 - Alexis Wilke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接