Class: Html2rss::Config::RequestHeaders

Inherits:
Object
  • Object
show all
Defined in:
lib/html2rss/config/request_headers.rb

Overview

Normalizes HTTP headers for outgoing requests. Ensures a browser-like baseline while respecting caller overrides.

Constant Summary collapse

DEFAULT_ACCEPT =

Browser-like default ‘Accept` header value.

%w[
  text/html
  application/xhtml+xml
  application/xml;q=0.9
  image/avif
  image/webp
  image/apng
  */*;q=0.8
].join(',')
DEFAULT_USER_AGENT =

Default ‘User-Agent` header value.

"html2rss/#{Html2rss::VERSION}".freeze
DEFAULT_HEADERS =

Baseline browser-like header set used for outbound requests.

{
  'Accept' => DEFAULT_ACCEPT,
  'Cache-Control' => 'max-age=0',
  'Connection' => 'keep-alive',
  'Sec-Fetch-Dest' => 'document',
  'Sec-Fetch-Mode' => 'navigate',
  'Sec-Fetch-Site' => 'none',
  'Sec-Fetch-User' => '?1',
  'Upgrade-Insecure-Requests' => '1',
  'User-Agent' => DEFAULT_USER_AGENT
}.freeze

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(headers, channel_language:, url:) ⇒ RequestHeaders

Returns a new instance of RequestHeaders.

Parameters:

  • headers (Hash{String, Symbol => String})

    caller-provided headers

  • channel_language (String, nil)

    channel language hint for Accept-Language

  • url (String, Html2rss::Url, nil)

    request URL used to infer Host



72
73
74
75
76
# File 'lib/html2rss/config/request_headers.rb', line 72

def initialize(headers, channel_language:, url:)
  @headers = headers
  @channel_language = channel_language
  @url = url
end

Class Method Details

.browser_defaultsHash{String => String}

:reek:ManualDispatch :reek:TooManyStatements

Returns:

  • (Hash{String => String})

    the default header set merged with global defaults



42
43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/html2rss/config/request_headers.rb', line 42

def browser_defaults
  defaults = DEFAULT_HEADERS.dup
  global_headers = Html2rss.configuration.headers
  global_headers = global_headers.call if global_headers.respond_to?(:call)

  if global_headers.is_a?(Hash)
    global_headers.each do |key, value|
      canonical_key = key.to_s.split('-').map(&:capitalize).join('-')
      defaults[canonical_key] = value.to_s
    end
  end

  defaults
end

.normalize(headers, channel_language:, url:) ⇒ Hash{String => String}

Normalizes the provided headers while applying Html2rss defaults.

Parameters:

  • headers (Hash, nil)

    caller provided headers

  • channel_language (String, nil)

    language defined on the channel

  • url (String)

    request URL used to infer the Host header

Returns:

  • (Hash{String => String})

    normalized HTTP headers



64
65
66
# File 'lib/html2rss/config/request_headers.rb', line 64

def normalize(headers, channel_language:, url:)
  new(headers || {}, channel_language:, url:).to_h
end

Instance Method Details

#to_hHash{String => String}

Returns normalized HTTP headers.

Returns:

  • (Hash{String => String})

    normalized HTTP headers



80
81
82
83
84
85
86
87
88
89
90
91
92
# File 'lib/html2rss/config/request_headers.rb', line 80

def to_h
  defaults = DEFAULT_HEADERS.dup
  normalized = normalize_custom_headers(headers)

  accept_override = normalized.delete('Accept')
  defaults.merge!(normalized)

  defaults['Accept'] = normalize_accept(accept_override)
  defaults['Accept-Language'] = build_accept_language
  defaults['Host'] ||= request_host

  defaults.compact
end