class Faraday::Response::Json
Parse response bodies as JSON.
Public Class Methods
new(app = nil, parser_options: nil, content_type: /\bjson$/, preserve_raw: false)
click to toggle source
Calls superclass method
Faraday::Middleware::new
# File lib/faraday/response/json.rb, line 9 def initialize(app = nil, parser_options: nil, content_type: /\bjson$/, preserve_raw: false) super(app) @parser_options = parser_options @content_types = Array(content_type) @preserve_raw = preserve_raw process_parser_options end
Public Instance Methods
on_complete(env)
click to toggle source
# File lib/faraday/response/json.rb, line 18 def on_complete(env) process_response(env) if parse_response?(env) end
Private Instance Methods
parse(body)
click to toggle source
# File lib/faraday/response/json.rb, line 31 def parse(body) return if body.strip.empty? decoder, method_name = @decoder_options decoder.public_send(method_name, body, @parser_options || {}) end
parse_response?(env)
click to toggle source
# File lib/faraday/response/json.rb, line 39 def parse_response?(env) process_response_type?(env) && env[:body].respond_to?(:to_str) end
process_parser_options()
click to toggle source
# File lib/faraday/response/json.rb, line 57 def process_parser_options @decoder_options = @parser_options&.delete(:decoder) @decoder_options = if @decoder_options.is_a?(Array) && @decoder_options.size >= 2 @decoder_options.slice(0, 2) elsif @decoder_options.respond_to?(:load) [@decoder_options, :load] else [::JSON, :parse] end end
process_response(env)
click to toggle source
# File lib/faraday/response/json.rb, line 24 def process_response(env) env[:raw_body] = env[:body] if @preserve_raw env[:body] = parse(env[:body]) rescue StandardError, SyntaxError => e raise Faraday::ParsingError.new(e, env[:response]) end
process_response_type?(env)
click to toggle source
# File lib/faraday/response/json.rb, line 44 def process_response_type?(env) type = response_type(env) @content_types.empty? || @content_types.any? do |pattern| pattern.is_a?(Regexp) ? type.match?(pattern) : type == pattern end end
response_type(env)
click to toggle source
# File lib/faraday/response/json.rb, line 51 def response_type(env) type = env[:response_headers][CONTENT_TYPE].to_s type = type.split(';', 2).first if type.index(';') type end