requester.rb 1.3 KB

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