1
0

web_request_concern.rb 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. module WebRequestConcern
  2. extend ActiveSupport::Concern
  3. def validate_web_request_options!
  4. if options['user_agent'].present?
  5. errors.add(:base, "user_agent must be a string") unless options['user_agent'].is_a?(String)
  6. end
  7. unless headers(options['headers']).is_a?(Hash)
  8. errors.add(:base, "if provided, headers must be a hash")
  9. end
  10. begin
  11. basic_auth_credentials(options['basic_auth'])
  12. rescue ArgumentError => e
  13. errors.add(:base, e.message)
  14. end
  15. end
  16. def faraday
  17. @faraday ||= Faraday.new { |builder|
  18. builder.headers = headers if headers.length > 0
  19. if (user_agent = interpolated['user_agent']).present?
  20. builder.headers[:user_agent] = user_agent
  21. end
  22. builder.use FaradayMiddleware::FollowRedirects
  23. builder.request :url_encoded
  24. if userinfo = basic_auth_credentials
  25. builder.request :basic_auth, *userinfo
  26. end
  27. case backend = faraday_backend
  28. when :typhoeus
  29. require 'typhoeus/adapters/faraday'
  30. end
  31. builder.adapter backend
  32. }
  33. end
  34. def headers(value = interpolated['headers'])
  35. value.presence || {}
  36. end
  37. def basic_auth_credentials(value = interpolated['basic_auth'])
  38. case value
  39. when nil, ''
  40. return nil
  41. when Array
  42. return value if value.size == 2
  43. when /:/
  44. return value.split(/:/, 2)
  45. end
  46. raise ArgumentError.new("bad value for basic_auth: #{value.inspect}")
  47. end
  48. def faraday_backend
  49. ENV.fetch('FARADAY_HTTP_BACKEND', 'typhoeus').to_sym
  50. end
  51. end