|  | require 'faraday'
require 'faraday_middleware'
module WebRequestConcern
  extend ActiveSupport::Concern
  def validate_web_request_options!
    if options['user_agent'].present?
      errors.add(:base, "user_agent must be a string") unless options['user_agent'].is_a?(String)
    end
    if options['disable_ssl_verification'].present? && boolify(options['disable_ssl_verification']).nil?
      errors.add(:base, "if provided, disable_ssl_verification must be true or false")
    end
    unless headers(options['headers']).is_a?(Hash)
      errors.add(:base, "if provided, headers must be a hash")
    end
    begin
      basic_auth_credentials(options['basic_auth'])
    rescue ArgumentError => e
      errors.add(:base, e.message)
    end
  end
  def faraday
    faraday_options = {
      ssl: {
        verify: !boolify(options['disable_ssl_verification'])
      }
    }
    @faraday ||= Faraday.new(faraday_options) { |builder|
      builder.headers = headers if headers.length > 0
      builder.headers[:user_agent] = user_agent
      builder.use FaradayMiddleware::FollowRedirects
      builder.request :url_encoded
      if userinfo = basic_auth_credentials
        builder.request :basic_auth, *userinfo
      end
      case backend = faraday_backend
        when :typhoeus
          require 'typhoeus/adapters/faraday'
      end
      builder.adapter backend
    }
  end
  def headers(value = interpolated['headers'])
    value.presence || {}
  end
  def basic_auth_credentials(value = interpolated['basic_auth'])
    case value
      when nil, ''
        return nil
      when Array
        return value if value.size == 2
      when /:/
        return value.split(/:/, 2)
    end
    raise ArgumentError.new("bad value for basic_auth: #{value.inspect}")
  end
  def faraday_backend
    ENV.fetch('FARADAY_HTTP_BACKEND', 'typhoeus').to_sym
  end
  def user_agent
    interpolated['user_agent'].presence || self.class.default_user_agent
  end
  module ClassMethods
    def default_user_agent
      ENV.fetch('DEFAULT_HTTP_USER_AGENT', "Huginn - https://github.com/cantino/huginn")
    end
  end
end
 |