module Faraday::Utils

Constants

DEFAULT_SEP
ESCAPE_RE

Attributes

default_params_encoder[W]

Public Instance Methods

URI(url) click to toggle source

Normalize URI() behavior across Ruby versions

url - A String or #URI.

Returns a parsed #URI.

# File lib/faraday/utils.rb, line 271
def URI(url)
  if url.respond_to?(:host)
    url
  elsif url.respond_to?(:to_str)
    default_uri_parser.call(url)
  else
    raise ArgumentError, "bad argument (expected URI object or URI string)"
  end
end
build_nested_query(params) click to toggle source
# File lib/faraday/utils.rb, line 196
def build_nested_query(params)
  NestedParamsEncoder.encode(params)
end
build_query(params) click to toggle source
# File lib/faraday/utils.rb, line 192
def build_query(params)
  FlatParamsEncoder.encode(params)
end
deep_merge(source, hash) click to toggle source

Recursive hash merge

# File lib/faraday/utils.rb, line 316
def deep_merge(source, hash)
  deep_merge!(source.dup, hash)
end
deep_merge!(target, hash) click to toggle source

Recursive hash update

# File lib/faraday/utils.rb, line 304
def deep_merge!(target, hash)
  hash.each do |key, value|
    if Hash === value and Hash === target[key]
      target[key] = deep_merge(target[key], value)
    else
      target[key] = value
    end
  end
  target
end
default_params_encoder() click to toggle source
# File lib/faraday/utils.rb, line 221
def default_params_encoder
  @default_params_encoder ||= NestedParamsEncoder
end
default_uri_parser() click to toggle source
# File lib/faraday/utils.rb, line 281
def default_uri_parser
  @default_uri_parser ||= begin
    require 'uri'
    Kernel.method(:URI)
  end
end
default_uri_parser=(parser) click to toggle source
# File lib/faraday/utils.rb, line 288
def default_uri_parser=(parser)
  @default_uri_parser = if parser.respond_to?(:call) || parser.nil?
    parser
  else
    parser.method(:parse)
  end
end
escape(s) click to toggle source
# File lib/faraday/utils.rb, line 202
def escape(s)
  s.to_s.gsub(ESCAPE_RE) {|match|
    '%' + match.unpack('H2' * match.bytesize).join('%').upcase
  }.tr(' ', '+')
end
normalize_params(params, name, v = nil) click to toggle source

Stolen from Rack

# File lib/faraday/utils.rb, line 230
def normalize_params(params, name, v = nil)
  name =~ %r(\A[\[\]]*([^\[\]]+)\]*)
  k = $1 || ''
  after = $' || ''

  return if k.empty?

  if after == ""
    if params[k]
      params[k] = Array[params[k]] unless params[k].kind_of?(Array)
      params[k] << v
    else
      params[k] = v
    end
  elsif after == "[]"
    params[k] ||= []
    raise TypeError, "expected Array (got #{params[k].class.name}) for param `#{k}'" unless params[k].is_a?(Array)
    params[k] << v
  elsif after =~ %r(^\[\]\[([^\[\]]+)\]$) || after =~ %r(^\[\](.+)$)
    child_key = $1
    params[k] ||= []
    raise TypeError, "expected Array (got #{params[k].class.name}) for param `#{k}'" unless params[k].is_a?(Array)
    if params[k].last.is_a?(Hash) && !params[k].last.key?(child_key)
      normalize_params(params[k].last, child_key, v)
    else
      params[k] << normalize_params({}, child_key, v)
    end
  else
    params[k] ||= {}
    raise TypeError, "expected Hash (got #{params[k].class.name}) for param `#{k}'" unless params[k].is_a?(Hash)
    params[k] = normalize_params(params[k], after, v)
  end

  return params
end
normalize_path(url) click to toggle source

Receives a String or #URI and returns just the path with the query string sorted.

# File lib/faraday/utils.rb, line 297
def normalize_path(url)
  url = URI(url)
  (url.path.start_with?('/') ? url.path : '/' + url.path) +
  (url.query ? "?#{sort_query_params(url.query)}" : "")
end
parse_nested_query(query) click to toggle source
# File lib/faraday/utils.rb, line 217
def parse_nested_query(query)
  NestedParamsEncoder.decode(query)
end
parse_query(query) click to toggle source

Adapted from Rack

# File lib/faraday/utils.rb, line 213
def parse_query(query)
  FlatParamsEncoder.decode(query)
end
unescape(s) click to toggle source
# File lib/faraday/utils.rb, line 208
def unescape(s) CGI.unescape s.to_s end

Protected Instance Methods

sort_query_params(query) click to toggle source
# File lib/faraday/utils.rb, line 322
def sort_query_params(query)
  query.split('&').sort.join('&')
end