we-promise/sure · error · StandardError

Mercury provider is not configured

Error message

Mercury provider is not configured

What it means

AuthenticationError raised inside request_cookie_and_crumb when the GET to https://fc.yahoo.com returns a response whose Set-Cookie cannot be extracted (extract_cookie returns blank). fc.yahoo.com is the canonical trick to obtain the session cookie; if Yahoo returns an error page, a redirect without cookies, or a consent wall, there is no cookie to authorize the subsequent getcrumb call, so auth cannot proceed. The 429 case is converted to RateLimitError before this check.

Solutions

  1. Inspect the fc.yahoo.com response status and headers from the same host: curl -vI https://fc.yahoo.com | grep -i set-cookie
  2. If 429s precede it, wait — rate limiting often degrades into cookie-less responses
  3. Disable/adjust proxy or middleware that strips Set-Cookie
  4. Retry later; transient Yahoo cookie-flow failures usually clear
  5. If permanent, switch securities lookups to an alternative configured provider

Example fix

# before
cookie = extract_cookie(cookie_response)
raise AuthenticationError, "Failed to obtain Yahoo Finance cookie" if cookie.blank?

# after (diagnose before failing)
cookie = extract_cookie(cookie_response)
if cookie.blank?
  Rails.logger.error("fc.yahoo.com status=#{cookie_response.status} headers=#{cookie_response.headers['Set-Cookie'].inspect}")
  raise AuthenticationError, "Failed to obtain Yahoo Finance cookie"
end
Defensive patterns

Strategy: retry

Try / catch

tries = 0
begin
  tries += 1
  provider.fetch_security_prices(symbol: s, start_date: a, end_date: b)
rescue Provider::YahooFinance::AuthenticationError => e
  raise unless e.message.include?("cookie") && tries < 3
  sleep(60)
  retry
end

Prevention

When it happens

Trigger: fc.yahoo.com responding 404/redirect without Set-Cookie (Yahoo has changed this behavior before); an intermediary proxy stripping Set-Cookie headers; Yahoo serving a consent/CAPTCHA page to your IP; cookie name changes making extract_cookie's parsing return nil.

Common situations: Datacenter IPs flagged by Yahoo; corporate proxies rewriting responses; Yahoo A/B changes to the cookie flow; Faraday middleware (e.g., aggressive cookie jar or redirect follower) consuming headers before extraction.

Related errors


AI-assisted analysis of we-promise/sure@e69894adb9 (2026-08-21). Data as JSON: /api/errors/229293bb753d1b95. Report an issue: GitHub.

Appendix: source

Thrown at app/models/mercury_item.rb:47

  scope :active, -> { where(scheduled_for_deletion: false) }
  scope :syncable, -> { active }
  scope :ordered, -> { order(created_at: :desc) }
  scope :needs_update, -> { where(status: :requires_update) }

  def destroy_later
    update!(scheduled_for_deletion: true)
    DestroyJob.perform_later(self)
  end

  # TODO: Implement data import from provider API
  # This method should fetch the latest data from the provider and import it.
  # May need provider-specific validation (e.g., session validity checks).
  # See LunchflowItem#import_latest_lunchflow_data or EnableBankingItem#import_latest_enable_banking_data for examples.
  def import_latest_mercury_data
    provider = mercury_provider
    unless provider
      Rails.logger.error "MercuryItem #{id} - Cannot import: provider is not configured"
      raise StandardError.new("Mercury provider is not configured")
    end

    # TODO: Add any provider-specific validation here (e.g., session checks)
    MercuryItem::Importer.new(self, mercury_provider: provider).import
  rescue => e
    Rails.logger.error "MercuryItem #{id} - Failed to import data: #{e.message}"
    raise
  end

  # TODO: Implement account processing logic
  # This method processes linked accounts after data import.
  # Customize based on your provider's data structure and processing needs.
  def process_accounts
    return [] if mercury_accounts.empty?

    results = []
    mercury_accounts.joins(:account).merge(Account.visible).each do |mercury_account|
      begin

View on GitHub (pinned to e69894adb9)