Class: Html2rss::RequestService::BotasaurusContract::ParsedResponse

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

Overview

Parsed Botasaurus response wrapper.

Constant Summary collapse

DEFAULT_HEADERS =

Fallback headers when upstream omits response headers.

{ 'content-type' => 'text/html' }.freeze

Instance Method Summary collapse

Constructor Details

#initialize(payload:, transport_status:) ⇒ ParsedResponse

Returns a new instance of ParsedResponse.

Parameters:

  • payload (Hash{String => Object})

    parsed Botasaurus response payload

  • transport_status (Integer)

    HTTP status returned by Botasaurus



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

def initialize(payload:, transport_status:)
  @payload = payload
  @transport_status = transport_status
end

Instance Method Details

#challenge_block?Boolean

Returns true when upstream classified request as challenge blocked.

Returns:

  • (Boolean)

    true when upstream classified request as challenge blocked



50
# File 'lib/html2rss/request_service/botasaurus_contract.rb', line 50

def challenge_block? = error_category == 'challenge_block'

#challenge_messageString

Returns normalized challenge error message.

Returns:

  • (String)

    normalized challenge error message



58
59
60
# File 'lib/html2rss/request_service/botasaurus_contract.rb', line 58

def challenge_message
  error || 'Botasaurus challenge block detected.'
end

#final_urlString?

Returns final URL reported by upstream.

Returns:

  • (String, nil)

    final URL reported by upstream



95
# File 'lib/html2rss/request_service/botasaurus_contract.rb', line 95

def final_url = payload['final_url']

#headersHash{String => String}

Returns normalized response headers.

Returns:

  • (Hash{String => String})

    normalized response headers



81
82
83
84
85
86
# File 'lib/html2rss/request_service/botasaurus_contract.rb', line 81

def headers
  raw_headers = payload['headers']
  return DEFAULT_HEADERS.dup unless raw_headers.is_a?(Hash) && raw_headers.any?

  raw_headers.to_h { |key, value| [key.to_s, value.to_s] }
end

#htmlString

Returns rendered HTML body from Botasaurus.

Returns:

  • (String)

    rendered HTML body from Botasaurus

Raises:



73
74
75
76
77
78
# File 'lib/html2rss/request_service/botasaurus_contract.rb', line 73

def html
  value = payload['html']
  raise BotasaurusConnectionFailed, "Botasaurus response missing required 'html' field" if value.nil?

  value.to_s
end

#statusInteger

Returns resolved status code (payload status_code or transport status).

Returns:

  • (Integer)

    resolved status code (payload status_code or transport status)



89
90
91
92
# File 'lib/html2rss/request_service/botasaurus_contract.rb', line 89

def status
  status_code = payload['status_code']
  status_code.is_a?(Integer) ? status_code : transport_status
end

#upstream_failure?Boolean

Returns true when upstream returned non-200 or an error payload.

Returns:

  • (Boolean)

    true when upstream returned non-200 or an error payload



53
54
55
# File 'lib/html2rss/request_service/botasaurus_contract.rb', line 53

def upstream_failure?
  status != 200 || error_message?
end

#upstream_failure_messageString

Returns actionable upstream failure summary.

Returns:

  • (String)

    actionable upstream failure summary



63
64
65
66
67
68
69
# File 'lib/html2rss/request_service/botasaurus_contract.rb', line 63

def upstream_failure_message
  details = ["status=#{status}"]
  details << "error_category=#{error_category}" if error_category
  details << "error=#{error}" if error
  details << "request_id=#{request_id}" if request_id
  "Botasaurus scrape failed (#{details.join(', ')})."
end