2016-06-16 26 views
1

我使用Typhoeus作为例子,但代码可以在任何Ruby中。假设有10000个网址看起来像这样:根据Ruby的当前大小,可以在Ruby中放置http请求吗?

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秒,HEAD请求然后0.7为实际请求)

有没有什么办法可以在Ruby中发出http请求,看它目前传输的内容大小,如果达到某个限制,就放弃它?例如。如果请求大于5 MB,请求放弃请求?或者,根据它的内容类型放弃它。

回答

2

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

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

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

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

我建议你坚持原来的计划:HEAD第一,然后GET,因为这是'HEAD'是专为。

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

+0

我一直在挖掘这方面的信息一个小时,这是迄今为止最好和最彻底的答案。谢谢。 'HEAD',然后是'GET'。 – MothOnMars

相关问题