我使用Typhoeus作为示例,但代码可以在Ruby中的任何内容中。假设有10000个网址如下所示:
http://example.com/somerandomstringwithoutextension
如果我在5 GB视频上运行以下代码,它会使应用程序崩溃,因为它会尝试将整个视频加载到内存中。
res = Typhoeus::Request.new(url, timeout: 15, followlocation: true).run
如果我首先在每个网址上发出HEAD请求来确定它的内容类型和内容大小,它将有助于解决内存问题,但它需要几乎两倍的时间(头部请求为0.7秒,然后是0.7秒)实际要求)
有没有办法在Ruby中发出http请求,看它当前转移的内容大小如果达到一定限制就丢弃它?例如。如果它们大于5 MB则丢弃请求?或者,根据它的内容类型删除它。
答案 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请求发送的信息。这种方法可以 用于获取有关该隐含的实体的元信息 请求而不转移实体主体本身。这个方法是 经常用于测试超文本链接的有效性,可访问性, 和最近的修改。