1
0

requester.rb 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. module Docs
  2. class Requester < Typhoeus::Hydra
  3. attr_reader :request_options
  4. def self.run(urls, options = {}, &block)
  5. urls = urls.dup
  6. requester = new(options)
  7. requester.on_response(&block) if block
  8. requester.on_response do # cheap hack to ensure root page is processed first
  9. if urls
  10. requester.request(urls)
  11. urls = nil
  12. end
  13. end
  14. requester.request(urls.shift)
  15. requester.run
  16. requester
  17. end
  18. def initialize(options = {})
  19. @request_options = options.extract!(:request_options)[:request_options].try(:dup) || {}
  20. options[:max_concurrency] ||= 20
  21. super
  22. end
  23. def request(urls, options = {}, &block)
  24. requests = [urls].flatten.map do |url|
  25. build_and_queue_request(url, options, &block)
  26. end
  27. requests.length == 1 ? requests.first : requests
  28. end
  29. def queue(request)
  30. request.on_complete(&method(:handle_response))
  31. super
  32. end
  33. def on_response(&block)
  34. @on_response ||= []
  35. @on_response << block if block
  36. @on_response
  37. end
  38. private
  39. def build_and_queue_request(url, options, &block)
  40. request = Request.new(url, request_options.merge(options))
  41. request.on_complete(&block) if block
  42. queue(request)
  43. request
  44. end
  45. def handle_response(response)
  46. on_response.each do |callback|
  47. result = callback.call(response)
  48. result.each { |url| request(url) } if result.is_a? Array
  49. end
  50. end
  51. end
  52. end