通过 http 传输大型二进制文件时的 HTTP 错误代码?
HTTP error codes when streaming large binary files over http?
我有一个 go 服务器正在读取和返回捆绑到 tar 中的大型数据文件。我已经测试过它可以工作并分段写入 tar 并且当所有数据加载时,一切都很好。
问题是可能会出现导致下载中断的意外错误。我目前写了一个 HTTP 错误代码和一条错误消息,但错误消息只是放在 stream/file 的末尾。有没有一种好的方式来传达导出中途失败的信息?是否可以使用 HTTP 状态代码并提供错误消息来做到这一点?
我正在使用以下 curl 命令:
curl --insecure https://127.0.0.1/api/export/030e28f3-4ab6-446a-852e-fda0a497ffe2 -o "test.tar"
我是否必须更改 curl 命令来检测错误(也)?
如果下载已经开始,则所有 HTTP header 都已发送到 HTTP 客户端。您不能再重写状态代码(它在第一行)。
您唯一能做的就是切断 tcp/ip 连接。如果您使用 'Content-Length' header 客户端将看到传输未完成。如果您使用 'Transfer-Encoding: chunked' 客户端将看到未收到 end-of-chunks 标记。在所有情况下,这都会使整个传输无效。
您可以尝试玩范围请求和部分内容响应,然后发送几个 HTTP request-response 对话框中的内容。但是,如果您通过单个 HTTP 对话框管理大文件传输,您唯一能做的就是中断传输,然后重新启动它。
通常在 HTTP 之上的应用层 上管理块中的大文件传输。就像上传一个 javascript 的东西会把文件分解成块,然后将它发送回专用的应用程序服务器,重建文件,在 http 之上使用专用协议来请求丢失的部分。这是因为在 real-life 狂野的 HTTP 环境中,长距离传输很困难,而且 range/partial 内容传输并不是所有潜在代理都能很好地管理。另一方面,使用简单的中等大小的 HTTP 请求几乎无处不在。因此,如果您同时控制客户端和服务器端,您可以在 HTTP 之上构建自己的对话并制定自己的分块传输协议,并具有良好的错误管理。
如果你控制客户端,你可以添加一个 HTTP 响应尾部 header 来指示错误,然后在客户端处理它。
有关响应预告片 headers 的更多信息:
https://developer.mozilla.org/enUS/docs/Web/HTTP/Headers/Trailer
我有一个 go 服务器正在读取和返回捆绑到 tar 中的大型数据文件。我已经测试过它可以工作并分段写入 tar 并且当所有数据加载时,一切都很好。
问题是可能会出现导致下载中断的意外错误。我目前写了一个 HTTP 错误代码和一条错误消息,但错误消息只是放在 stream/file 的末尾。有没有一种好的方式来传达导出中途失败的信息?是否可以使用 HTTP 状态代码并提供错误消息来做到这一点?
我正在使用以下 curl 命令:
curl --insecure https://127.0.0.1/api/export/030e28f3-4ab6-446a-852e-fda0a497ffe2 -o "test.tar"
我是否必须更改 curl 命令来检测错误(也)?
如果下载已经开始,则所有 HTTP header 都已发送到 HTTP 客户端。您不能再重写状态代码(它在第一行)。
您唯一能做的就是切断 tcp/ip 连接。如果您使用 'Content-Length' header 客户端将看到传输未完成。如果您使用 'Transfer-Encoding: chunked' 客户端将看到未收到 end-of-chunks 标记。在所有情况下,这都会使整个传输无效。
您可以尝试玩范围请求和部分内容响应,然后发送几个 HTTP request-response 对话框中的内容。但是,如果您通过单个 HTTP 对话框管理大文件传输,您唯一能做的就是中断传输,然后重新启动它。
通常在 HTTP 之上的应用层 上管理块中的大文件传输。就像上传一个 javascript 的东西会把文件分解成块,然后将它发送回专用的应用程序服务器,重建文件,在 http 之上使用专用协议来请求丢失的部分。这是因为在 real-life 狂野的 HTTP 环境中,长距离传输很困难,而且 range/partial 内容传输并不是所有潜在代理都能很好地管理。另一方面,使用简单的中等大小的 HTTP 请求几乎无处不在。因此,如果您同时控制客户端和服务器端,您可以在 HTTP 之上构建自己的对话并制定自己的分块传输协议,并具有良好的错误管理。
如果你控制客户端,你可以添加一个 HTTP 响应尾部 header 来指示错误,然后在客户端处理它。
有关响应预告片 headers 的更多信息: https://developer.mozilla.org/enUS/docs/Web/HTTP/Headers/Trailer