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



32
33
34
35
36
37
# File 'lib/html2rss/request_session.rb', line 32

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, logger: Html2rss::Log) ⇒ RequestSession

Builds a request session from translated runtime request inputs.

Parameters:

  • runtime_input (RuntimeInput)

    translated runtime request inputs

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

    logger used for operational warnings

Returns:



14
15
16
17
18
19
20
21
22
23
24
25
# File 'lib/html2rss/request_session.rb', line 14

def from_runtime_input(runtime_input, logger: Html2rss::Log)
  new(
    context: RequestService::Context.new(
      url: runtime_input.url,
      headers: runtime_input.headers,
      request: runtime_input.request,
      policy: runtime_input.request_policy
    ),
    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



63
64
65
66
67
68
69
70
71
72
73
# File 'lib/html2rss/request_session.rb', line 63

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:



43
44
45
# File 'lib/html2rss/request_session.rb', line 43

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:



54
55
56
# File 'lib/html2rss/request_session.rb', line 54

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



79
80
81
# File 'lib/html2rss/request_session.rb', line 79

def max_requests
  context.policy.max_requests
end

#remember!(url) ⇒ Set<Html2rss::Url>

Records a visited url in the session.

Parameters:

Returns:



95
96
97
# File 'lib/html2rss/request_session.rb', line 95

def remember!(url)
  visited_urls.add(normalize_url(url))
end

#visited?(url) ⇒ Boolean

Returns whether the url was already visited in this session.

Parameters:

Returns:

  • (Boolean)

    whether the url was already visited in this session



86
87
88
# File 'lib/html2rss/request_session.rb', line 86

def visited?(url)
  visited_urls.include?(normalize_url(url))
end