Class: Html2rss::RequestService::Response

Inherits:
Object
  • Object
show all
Defined in:
lib/html2rss/request_service/response.rb

Overview

To be used by strategies to provide their response.

Constant Summary collapse

EMPTY_TRANSPORT_META =

Default when a strategy does not attach transport telemetry.

{}.freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(body:, url:, headers: {}, status: nil, transport_meta: EMPTY_TRANSPORT_META) ⇒ Response

Returns a new instance of Response.

Parameters:

  • body (String)

    the body of the response

  • url (Html2rss::Url)

    the final request URL

  • headers (Hash) (defaults to: {})

    the headers of the response

  • status (Integer, nil) (defaults to: nil)

    the HTTP status code when available

  • transport_meta (Hash) (defaults to: EMPTY_TRANSPORT_META)

    allowlisted upstream telemetry (frozen when present)



19
20
21
22
23
24
25
26
27
28
29
30
# File 'lib/html2rss/request_service/response.rb', line 19

def initialize(body:, url:, headers: {}, status: nil, transport_meta: EMPTY_TRANSPORT_META)
  @body = body

  headers = headers.dup
  headers.transform_keys!(&:to_s)
  HashUtil.assert_string_keys!(headers, context: 'response headers', deep: false)

  @headers = headers
  @status = status
  @url = url
  @transport_meta = transport_meta.nil? || transport_meta.empty? ? EMPTY_TRANSPORT_META : transport_meta.freeze
end

Instance Attribute Details

#bodyString (readonly)

Returns the raw body of the response.

Returns:

  • (String)

    the raw body of the response



33
34
35
# File 'lib/html2rss/request_service/response.rb', line 33

def body
  @body
end

#headersHash{String => Object} (readonly)

Returns the headers of the response.

Returns:

  • (Hash{String => Object})

    the headers of the response



36
37
38
# File 'lib/html2rss/request_service/response.rb', line 36

def headers
  @headers
end

#statusInteger? (readonly)

Returns the HTTP status code when known.

Returns:

  • (Integer, nil)

    the HTTP status code when known



39
40
41
# File 'lib/html2rss/request_service/response.rb', line 39

def status
  @status
end

#transport_metaHash (readonly)

Returns allowlisted upstream transport telemetry.

Returns:

  • (Hash)

    allowlisted upstream transport telemetry



45
46
47
# File 'lib/html2rss/request_service/response.rb', line 45

def transport_meta
  @transport_meta
end

#urlHtml2rss::Url (readonly)

Returns the URL of the response.

Returns:



42
43
44
# File 'lib/html2rss/request_service/response.rb', line 42

def url
  @url
end

Instance Method Details

#content_typeString

Returns normalized content type header value.

Returns:

  • (String)

    normalized content type header value



48
# File 'lib/html2rss/request_service/response.rb', line 48

def content_type = header('content-type').to_s

#html_response?Boolean

Returns whether response content is HTML.

Returns:

  • (Boolean)

    whether response content is HTML



54
# File 'lib/html2rss/request_service/response.rb', line 54

def html_response? = content_type.include?('text/html')

#json_response?Boolean

Returns whether response content is JSON.

Returns:

  • (Boolean)

    whether response content is JSON



51
# File 'lib/html2rss/request_service/response.rb', line 51

def json_response? = content_type.include?('application/json')

#parsed_bodyNokogiri::HTML::Document, Hash

Returns the parsed body of the response, frozen object.

Returns:

  • (Nokogiri::HTML::Document, Hash)

    the parsed body of the response, frozen object

Raises:



59
60
61
62
63
64
65
66
67
68
69
70
# File 'lib/html2rss/request_service/response.rb', line 59

def parsed_body
  @parsed_body ||= if html_response?
                     Nokogiri::HTML(body).tap do |doc|
                       # Remove comments from the document to avoid processing irrelevant content
                       doc.xpath('//comment()').each(&:remove)
                     end.freeze
                   elsif json_response?
                     JSON.parse(body, symbolize_names: true).freeze
                   else
                     raise UnsupportedResponseContentType, "Unsupported content type: #{content_type}"
                   end
end