Class: Html2rss::RequestSession

Inherits:
Object
  • Object
show all
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

Instance Method Summary collapse

Constructor Details

#initialize(context:, strategy:, logger: Html2rss::Log) ⇒ RequestSession

Returns a new instance of RequestSession.

Parameters:

  • context (RequestService::Context)

    initial request context

  • strategy (Symbol)

    request strategy to use for all requests in the session

  • logger (Logger) (defaults to: Html2rss::Log)

    logger used for operational warnings



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.

Parameters:

  • runtime_input (RuntimeInput)

    translated runtime request inputs

  • budget (RequestService::Budget, nil) (defaults to: nil)

    optional shared budget for multi-attempt runs

  • logger (Logger) (defaults to: Html2rss::Log)

    logger used for operational warnings

Returns:



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
  context_options = {
    url: runtime_input.url,
    headers: runtime_input.headers,
    request: runtime_input.request,
    policy: runtime_input.request_policy
  }
  context_options[:budget] = budget unless budget.nil?

  new(
    context: RequestService::Context.new(**context_options),
    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.

Parameters:

  • requested_pages (Integer)

    configured page budget

Returns:

  • (Integer)

    effective page budget for the session



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_responseRequestService::Response

Executes the initial request for the session.

Returns:



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.

Parameters:

  • url (String, Html2rss::Url)

    follow-up request url

  • relation (Symbol)

    why the follow-up is being made

  • origin_url (String, Html2rss::Url)

    effective origin for same-origin checks

Returns:



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_requestsInteger

Returns the configured request budget for the session.

Returns:

  • (Integer)

    maximum requests allowed for the feed build



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.

Parameters:

  • url (String, Html2rss::Url)

    URL used to update relation tracking state

Returns:



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.

Parameters:

  • url (String, Html2rss::Url)

    follow-up target URL for the request

Returns:

  • (Boolean)

    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