1

我以 Typhoeus 为例,但代码可以是 Ruby 中的任何内容。假设有 10000 个 url,如下所示:

http://example.com/somerandomstringwithoutextension
  1. url 可以是任何内容类型——视频、html、图像,任何东西。
  2. 我只需要加载 html 文档并忽略其余的以提高速度和内存效率。

如果我在 5 GB 视频上运行以下代码,它会导致应用程序崩溃,因为它会尝试将整个视频加载到内存中。

res = Typhoeus::Request.new(url, timeout: 15, followlocation: true).run

如果我首先在每个 url 上发出 HEAD 请求以确定它的内容类型和内容大小,它将有助于解决内存问题,但它将花费几乎两倍的时间(头部请求为 0.7 秒,实际请求为 0.7 秒)

有什么方法可以在 Ruby 中发出 http 请求,观察它当前传输的内容大小并在达到一定限制时丢弃它?例如,如果请求大于 5 MB,则丢弃请求?或者,根据它的内容类型删除它。

4

1 回答 1

2

这可能是可能的,但它很复杂。

根据HTTP/1.1 规范,实际上有一个“部分 GET”。

如果请求消息包含 Range 标头字段,则 GET 方法的语义更改为“部分 GET”。部分 GET 请求仅传输实体的一部分,如第 14.35 节所述。部分 GET 方法旨在通过允许完成部分检索的实体而不传输客户端已经持有的数据来减少不必要的网络使用。

您可以指定 Range 标头字段来触发“部分 GET”,但这取决于服务器是否支持它。另外,我怀疑 Typhoeus 客户端是否支持部分 GET,您可能必须使用它Net::HTTP来实现这一点,我也不确定这是否可以实现。

我建议您坚持最初的计划:首先是 HEAD,然后是 GET,因为这是“HEAD”的设计目的。

HEAD 方法与 GET 相同,只是服务器不能在响应中返回消息体。响应 HEAD 请求的 HTTP 标头中包含的元信息应该与响应 GET 请求发送的信息相同。此方法可用于获取有关请求所隐含的实体的元信息,而无需传输实体主体本身。这种方法通常用于测试超文本链接的有效性、可访问性和最近的修改。

于 2016-06-16T10:59:26.833 回答