lib/http_reader/engine.rb in http_reader-0.0.1 vs lib/http_reader/engine.rb in http_reader-0.0.2

- old
+ new

@@ -6,18 +6,19 @@ module HttpReader class Engine ReadError = Class.new(StandardError) DefaultResponse = Struct.new(:body, :code, :message, :headers) - attr_reader :parsers, :default_parser, :http_client, :browser, :logger + attr_reader :parsers, :default_parser, :http_client, :browser, :logger, :browser_keep_running def initialize(config = {}) @parsers = config.fetch(:parsers, []) @default_parser = config.fetch(:default_parser, HashPageParser) @http_client = config.fetch(:http_client, HTTParty) @browser = config.fetch(:browser, Watir::Browser) @logger = config.fetch(:logger, Logger.new(STDOUT)) + @browser_keep_running = config.fetch(:browser_keep_running, true) end def read(url, opts = {}) parser = opts[:parser] || find_parser(url) response = if parser.use_browser @@ -33,10 +34,16 @@ rescue => e log_error('read', e, "url: #{url}, opts: #{opts.to_json}") raise ReadError.new(e.message) end + def close_browser + active_browser.close + headless.destroy + @active_browser = nil + end + private def find_parser(url) parsers.each do |parser| return parser if parser.match(url) @@ -44,16 +51,13 @@ default_parser end def browse(url, parser, opts = {}) - html = nil - headless.start - b = browser.start(url) - html = parser.browse_actions_for_html(b, opts) - b.close - headless.destroy + active_browser.goto(url) + html = parser.browse_actions_for_html(active_browser, opts) + close_browser unless browser_keep_running DefaultResponse.new(html, 200, opts[:message] || "success") rescue => e log_error('browse', e) DefaultResponse.new(html, 500, e.message) end @@ -65,11 +69,20 @@ rescue => e log_error('request', e) DefaultResponse.new(nil, 500, e.message) end + def active_browser + @active_browser ||= new_browser + end + + def new_browser + headless.start + browser.new + end + def headless - @headless ||= Headless.new + @headless ||= Headless.new(display: 100, reuse: true, destroy_at_exit: true) end def log_error(method, ex, info = nil) logger.error("HttpReader::Engine##{method} - #{ex.message} #{info}") end