Cha*_* L. 4 streaming curl http http-status-codes
我有一个 go 服务器正在读取并返回捆绑到 tar 中的大型数据文件。我已经测试过这可以工作并将 tar 分成几部分,并且当所有数据加载时,一切都很好。
问题是,可能会出现意外错误,导致下载中断。我当前编写了一个 HTTP 错误代码和一条错误消息,但错误消息只是放在流/文件的末尾。有没有好的方法来传达导出中途失败的情况?是否可以使用 HTTP 状态代码并提供错误消息来做到这一点?
我正在使用以下curl命令:
curl --insecure https://127.0.0.1/api/export/030e28f3-4ab6-446a-852e-fda0a497ffe2 -o "test.tar"
Run Code Online (Sandbox Code Playgroud)
我是否也必须更改curl命令来检测错误?
如果下载已经开始,则所有 HTTP 标头都已发送到 HTTP 客户端。您不能再重写状态代码(它位于第一行)。
您唯一能做的就是切断 TCP/IP 连接。如果您使用Content-Length标头,客户端将看到传输不完整。如果您使用Transfer-Encoding: chunked客户端,则会看到未收到块结束标记。在所有情况下,这都会使整个传输失效。
您可以尝试使用范围请求和部分内容响应,并在多个 HTTP 请求响应对话框中发送内容。但是,如果您通过单个 HTTP 对话框管理大文件传输,您唯一能做的就是中断传输,然后完全重新启动。
通常,大文件的块传输是在HTTP 之上的应用层上进行管理的。就像上传一样,JavaScript 会将文件分解成块,并将其发送回专用应用程序服务器,重建文件,并使用 HTTP 之上的专用协议来询问丢失的部分。这是因为在现实生活中的狂野 HTTP 环境中,长距离传输很困难,并且所有潜在代理都不能很好地管理范围/部分内容传输。另一方面,使用简单的中等大小的 HTTP 请求几乎可以在任何地方使用。因此,如果您同时控制客户端和服务器端,您就可以在 HTTP 之上构建自己的对话框,并制定自己的分块传输协议,并具有良好的错误管理功能。