requester.rb 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. require 'typhoeus'
  2. module Docs
  3. class Requester < Typhoeus::Hydra
  4. attr_reader :request_options
  5. def self.run(urls, options = {}, &block)
  6. requester = new(options)
  7. requester.on_response(&block) if block
  8. requester.request(urls)
  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(urls, options = {}, &block)
  18. requests = [urls].flatten.map do |url|
  19. build_and_queue_request(url, options, &block)
  20. end
  21. requests.length == 1 ? requests.first : requests
  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 build_and_queue_request(url, options, &block)
  34. request = Request.new(url, request_options.merge(options))
  35. request.on_complete(&block) if block
  36. queue(request)
  37. request
  38. end
  39. def handle_response(response)
  40. on_response.each do |callback|
  41. result = callback.call(response)
  42. result.each { |url| request(url) } if result.is_a? Array
  43. end
  44. end
  45. end
  46. end