【发布时间】:2011-05-23 10:06:48
【问题描述】:
我们正在尝试使用 TIdHTTPServer 组件为我们的软件编写更新服务器。目前我们正在提供一个 XML 文件,其中列出了可用更新及其文件版本等,当客户端程序找到更新版本时,它应该开始使用 BITS 下载它。
现在这是我们遇到问题的地方,我们的程序正在请求 XML 文件并看到有可用的更新。然后它会创建一个 BITS 作业来下载它,但是 BITS 不断报告下载失败。我们可以使用相同的 URL 和 IE/Firefox/Chrome 下载文件。
所以我的问题:
TIdHTTPServer 是否与 BITS 兼容?
我问这个问题是因为我发现 bit 需要这些下载要求才能工作。
HTTP Requirements for BITS Downloads
BITS 支持 HTTP 和 HTTPS 下载和上传,并要求服务器支持 HTTP/1.1 协议。对于下载,HTTP 服务器的 Head 方法必须返回文件大小,并且它的 Get 方法必须支持 Content-Range 和 Content-Length 标头。因此,BITS 仅传输静态文件内容,如果您尝试传输动态内容,则会生成错误,除非 ASP、ISAPI 或 CGI 脚本支持 Content-Range 和 Content-Length 标头。
BITS 可以使用 HTTP/1.0 服务器,只要它满足 Head 和 Get 方法的要求。
要支持文件的下载范围,服务器必须支持以下要求:
允许 MIME 标头包含标准的 Content-Range 和 Content-Type 标头,以及最多 180 字节的其他标头。 在 HTTP 标头和第一个边界字符串之间最多允许两个 CR/LF。
【问题讨论】:
-
好的,查看了 wireshark 跟踪和 Indy 源代码,看起来 TIdHTTPServer 确实不支持 Range 检索请求的 Range / Content-Range 标头。
-
那么是否可以从 GET 请求中读取 Range 标头,然后将请求的字节从源文件中读取到内存流中,将内存流分配给内容流以进行发送并最终设置内容范围标头。
-
TIdHTTPServer 支持
Content-Type、Content-Range和Range标头,但是应用程序的 OnCommandGet 事件处理程序负责实际查看它们并相应地发送正确的数据。 TIdHTTPHeaderEntityInfo 类具有可用的 ContentType、ContentRangeStart、ContentRangeEnd、ContentRangeInstanceLength 和 Range 属性。 TIdHTTPServer 本身并不处理实际的数据范围,用户的代码必须管理它。
标签: delphi http indy httpserver microsoft-bits