Class: Html2rss::RequestSession
- Inherits:
-
Object
- Object
- Html2rss::RequestSession
- Defined in:
- lib/html2rss/request_session.rb,
lib/html2rss/request_session/runtime_input.rb,
lib/html2rss/request_session/rel_next_pager.rb,
lib/html2rss/request_session/runtime_policy.rb
Overview
Coordinates multi-request feed builds on top of RequestService.
Defined Under Namespace
Classes: RelNextPager, RuntimeInput, RuntimePolicy
Class Method Summary collapse
-
.from_runtime_input(runtime_input, budget: nil, logger: Html2rss::Log) ⇒ RequestSession
Builds a request session from translated runtime request inputs.
Instance Method Summary collapse
-
#effective_page_budget(requested_pages) ⇒ Integer
Returns the effective page budget after applying the policy ceiling.
-
#fetch_initial_response ⇒ RequestService::Response
Executes the initial request for the session.
-
#follow_up(url:, relation:, origin_url:) ⇒ RequestService::Response
Executes a follow-up request sharing policy, headers, and budget.
-
#initialize(context:, strategy:, logger: Html2rss::Log) ⇒ RequestSession
constructor
A new instance of RequestSession.
-
#max_requests ⇒ Integer
Returns the configured request budget for the session.
-
#remember!(url) ⇒ Set<Html2rss::Url>
Records a visited url in the session.
-
#visited?(url) ⇒ Boolean
Whether the url was already visited in this session.
Constructor Details
#initialize(context:, strategy:, logger: Html2rss::Log) ⇒ RequestSession
Returns a new instance of RequestSession.
36 37 38 39 40 41 |
# File 'lib/html2rss/request_session.rb', line 36 def initialize(context:, strategy:, logger: Html2rss::Log) @context = context @strategy = strategy @logger = logger @visited_urls = Set.new end |
Class Method Details
.from_runtime_input(runtime_input, budget: nil, logger: Html2rss::Log) ⇒ RequestSession
Builds a request session from translated runtime request inputs.
15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
# File 'lib/html2rss/request_session.rb', line 15 def from_runtime_input(runtime_input, budget: nil, logger: Html2rss::Log) # rubocop:disable Metrics/MethodLength = { url: runtime_input.url, headers: runtime_input.headers, request: runtime_input.request, policy: runtime_input.request_policy } [:budget] = budget unless budget.nil? new( context: RequestService::Context.new(**), strategy: runtime_input.strategy, logger: ) end |
Instance Method Details
#effective_page_budget(requested_pages) ⇒ Integer
Returns the effective page budget after applying the policy ceiling.
67 68 69 70 71 72 73 74 75 76 77 |
# File 'lib/html2rss/request_session.rb', line 67 def effective_page_budget(requested_pages) effective_pages = [requested_pages, context.policy.max_requests].min return effective_pages if effective_pages == requested_pages logger.warn( "#{self.class}: pagination max_pages=#{requested_pages} " \ "exceeds system ceiling=#{context.policy.max_requests}; " \ "clamping to #{effective_pages}" ) effective_pages end |
#fetch_initial_response ⇒ RequestService::Response
Executes the initial request for the session.
47 48 49 |
# File 'lib/html2rss/request_session.rb', line 47 def fetch_initial_response execute(context).tap { |response| remember!(response.url) } end |
#follow_up(url:, relation:, origin_url:) ⇒ RequestService::Response
Executes a follow-up request sharing policy, headers, and budget.
58 59 60 |
# File 'lib/html2rss/request_session.rb', line 58 def follow_up(url:, relation:, origin_url:) execute(context.follow_up(url:, relation:, origin_url:)).tap { |response| remember!(response.url) } end |
#max_requests ⇒ Integer
Returns the configured request budget for the session.
83 84 85 |
# File 'lib/html2rss/request_session.rb', line 83 def max_requests context.policy.max_requests end |
#remember!(url) ⇒ Set<Html2rss::Url>
Records a visited url in the session.
99 100 101 |
# File 'lib/html2rss/request_session.rb', line 99 def remember!(url) visited_urls.add(normalize_url(url)) end |
#visited?(url) ⇒ Boolean
Returns whether the url was already visited in this session.
90 91 92 |
# File 'lib/html2rss/request_session.rb', line 90 def visited?(url) visited_urls.include?(normalize_url(url)) end |