class Rack::QueryParser

Constants

COMMON_SEP
DEFAULT_SEP
ParamsTooDeepError

QueryLimitError is for errors raised when the query provided exceeds one of the query parser limits.

Attributes

Public Class Methods

# File lib/rack/query_parser.rb, line 36
def self.make_default(param_depth_limit, **options)
  new(Params, param_depth_limit, **options)
end
# File lib/rack/query_parser.rb, line 62
def initialize(params_class, param_depth_limit, bytesize_limit: BYTESIZE_LIMIT, params_limit: PARAMS_LIMIT)
  @params_class = params_class
  @param_depth_limit = param_depth_limit
  @bytesize_limit = bytesize_limit
  @params_limit = params_limit
end

Public Instance Methods

# File lib/rack/query_parser.rb, line 196
def make_params
  @params_class.new
end
# File lib/rack/query_parser.rb, line 200
def new_depth_limit(param_depth_limit)
  self.class.new @params_class, param_depth_limit
end

normalize_params recursively expands parameters into structural types. If the structural types represented by two different parameter names are in conflict, a ParameterTypeError is raised. The depth argument is deprecated and should no longer be used, it is kept for backwards compatibility with earlier versions of rack.

# File lib/rack/query_parser.rb, line 124
def normalize_params(params, name, v, _depth=nil)
  _normalize_params(params, name, v, 0)
end

parse_nested_query expands a query string into structural types. Supported types are Arrays, Hashes and basic value types. It is possible to supply query strings with parameters of conflicting types, in this case a ParameterTypeError is raised. Users are encouraged to return a 400 in this case.

# File lib/rack/query_parser.rb, line 109
def parse_nested_query(qs, separator = nil)
  params = make_params

  each_query_pair(qs, separator) do |k, v|
    _normalize_params(params, k, v, 0)
  end

  return params.to_h
end

Stolen from Mongrel, with some small modifications: Parses a query string by breaking it up at the ‘&’. You can also use this to parse cookies by changing the characters used in the second parameter (which defaults to ‘&’).

# File lib/rack/query_parser.rb, line 73
def parse_query(qs, separator = nil, &unescaper)
  params = make_params

  each_query_pair(qs, separator, unescaper) do |k, v|
    if cur = params[k]
      if cur.class == Array
        params[k] << v
      else
        params[k] = [cur, v]
      end
    else
      params[k] = v
    end
  end

  return params.to_h
end

Parses a query string by breaking it up at the ‘&’, returning all key-value pairs as an array of [key, value] arrays. Unlike parse_query, this preserves all duplicate keys rather than collapsing them.

# File lib/rack/query_parser.rb, line 94
def parse_query_pairs(qs, separator = nil)
  pairs = []

  each_query_pair(qs, separator) do |k, v|
    pairs << [k, v]
  end

  pairs
end