requester.rb 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. require 'typhoeus'
  2. module Docs
  3. class Requester < Typhoeus::Hydra
  4. attr_reader :request_options
  5. def self.run(url, options = {}, &block)
  6. requester = new(options)
  7. requester.on_response(&block) if block
  8. requester.request(url)
  9. requester.run
  10. requester
  11. end
  12. def initialize(options = {})
  13. @request_options = options.extract!(:request_options)[:request_options].try(:dup) || {}
  14. options[:max_concurrency] ||= 20
  15. super
  16. end
  17. def request(url, options = {}, &block)
  18. request = Request.new(url, request_options.merge(options))
  19. request.on_complete(&block) if block
  20. queue(request)
  21. request
  22. end
  23. def queue(request)
  24. request.on_complete(&method(:handle_response))
  25. super
  26. end
  27. def on_response(&block)
  28. @on_response ||= []
  29. @on_response << block if block
  30. @on_response
  31. end
  32. private
  33. def handle_response(response)
  34. on_response.each do |callback|
  35. result = callback.call(response)
  36. result.each { |url| request(url) } if result.is_a? Array
  37. end
  38. end
  39. end
  40. end