|
|
|
@ -13,6 +13,8 @@ module Docs
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
@@rate_limiter = nil
|
|
|
|
|
|
|
|
|
|
self.params = {}
|
|
|
|
|
self.headers = { 'User-Agent' => 'DevDocs' }
|
|
|
|
|
self.force_gzip = false
|
|
|
|
@ -24,6 +26,15 @@ module Docs
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def request_all(urls, &block)
|
|
|
|
|
if options[:rate_limit]
|
|
|
|
|
if @@rate_limiter
|
|
|
|
|
@@rate_limiter.limit = options[:rate_limit]
|
|
|
|
|
else
|
|
|
|
|
@@rate_limiter = RateLimiter.new(options[:rate_limit])
|
|
|
|
|
Typhoeus.before(&@@rate_limiter.to_proc)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
Requester.run urls, request_options: request_options, &block
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
@ -165,5 +176,35 @@ module Docs
|
|
|
|
|
super.merge! redirections: self.class.redirections
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
class RateLimiter
|
|
|
|
|
attr_accessor :limit
|
|
|
|
|
|
|
|
|
|
def initialize(limit)
|
|
|
|
|
@limit = limit
|
|
|
|
|
@minute = nil
|
|
|
|
|
@counter = 0
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def call(*)
|
|
|
|
|
if @minute != Time.now.min
|
|
|
|
|
@minute = Time.now.min
|
|
|
|
|
@counter = 0
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
@counter += 1
|
|
|
|
|
|
|
|
|
|
if @counter >= @limit
|
|
|
|
|
wait = Time.now.end_of_minute.to_i - Time.now.to_i + 1
|
|
|
|
|
sleep wait
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
true
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def to_proc
|
|
|
|
|
method(:call).to_proc
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|