1
0

requester.rb 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  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. options[:pipelining] = false
  22. super
  23. end
  24. def request(urls, options = {}, &block)
  25. requests = [urls].flatten.map do |url|
  26. build_and_queue_request(url, options, &block)
  27. end
  28. requests.length == 1 ? requests.first : requests
  29. end
  30. def queue(request)
  31. request.on_complete(&method(:handle_response))
  32. super
  33. end
  34. def on_response(&block)
  35. @on_response ||= []
  36. @on_response << block if block
  37. @on_response
  38. end
  39. private
  40. def build_and_queue_request(url, options, &block)
  41. request = Request.new(url, request_options.merge(options))
  42. request.on_complete(&block) if block
  43. queue(request)
  44. request
  45. end
  46. def handle_response(response)
  47. on_response.each do |callback|
  48. result = callback.call(response)
  49. result.each { |url| request(url) } if result.is_a? Array
  50. end
  51. end
  52. end
  53. end