可以根据当前大小在Ruby中删除http请求吗?

时间:2016-06-16 10:43:01

标签: ruby-on-rails ruby http typhoeus

我使用Typhoeus作为示例,但代码可以在Ruby中的任何内容中。假设有10000个网址如下所示:

http://example.com/somerandomstringwithoutextension
  1. 网址可以是任何内容类型 - 视频,html,图片, 任何东西。
  2. 我只需要加载html文档而忽略其余文件 速度和内存效率。
  3. 如果我在5 GB视频上运行以下代码,它会使应用程序崩溃,因为它会尝试将整个视频加载到内存中。

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

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

    有没有办法在Ruby中发出http请求,看它当前转移的内容大小如果达到一定限制就丢弃它?例如。如果它们大于5 MB则丢弃请求?或者,根据它的内容类型删除它。

1 个答案:

答案 0 :(得分:2)

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

根据HTTP/1.1 spec,实际上存在“部分GET”。

  

如果是,则GET方法的语义变为“部分GET”   请求消息包括Range头字段。部分GET请求   只有部分实体可以转让,如部分所述   14.35。部分GET方法旨在通过允许完成部分检索的实体来减少不必要的网络使用   没有传输客户已经拥有的数据。

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

我建议你坚持最初的计划:首先是HEAD,然后是GET,因为那是'HEAD'的设计目的。

  

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