From 644580145cd2b92ad6836ef7e9390933f1218ca5 Mon Sep 17 00:00:00 2001 From: Ben Chiu Date: Sat, 24 May 2008 05:12:54 +0800 Subject: [PATCH] Preserve order parse query, respect query string override in test request * added option 'preserve_order' to query_parse. retaining order of args is necessary to generate cache urls that nginx/apache can match. * allow params_to_query_string to accept Dictionary and respect order of args * Test::RequestHelper.dispatch_to method creates QUERY_STRING env variable from params and overwrites passed-in value. this behaviour does not match live environment. it also makes it impossible to generate consistent cache keys from query. this tests if QUERY_STRING exists before overwriting it. --- lib/merb-core/dispatch/request.rb | 15 +++++++++------ lib/merb-core/test/helpers/request_helper.rb | 5 ++--- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/lib/merb-core/dispatch/request.rb b/lib/merb-core/dispatch/request.rb index 9d4624c..139aa94 100644 --- a/lib/merb-core/dispatch/request.rb +++ b/lib/merb-core/dispatch/request.rb @@ -379,7 +379,7 @@ module Merb class << self # ==== Parameters - # value:: The value for the query string. + # value:: The value for the query string. # prefix<~to_s>:: The prefix to add to the query string keys. # # ==== Returns @@ -403,7 +403,7 @@ module Merb value.map { |v| params_to_query_string(v, "#{prefix}[]") } * "&" - when Hash + when Hash, Dictionary value.map { |k, v| params_to_query_string(v, prefix ? "#{prefix}[#{Merb::Request.escape(k)}]" : Merb::Request.escape(k)) } * "&" @@ -437,18 +437,21 @@ module Merb # ==== Parameters # qs:: The query string. # d:: The query string divider. Defaults to "&". + # preserve_order:: Preserve order of args. Defaults to false. # # ==== Returns - # Mash:: The parsed query string. + # Mash:: The parsed query string (Dictionary if preserve_order is set). # # ==== Examples # query_parse("bar=nik&post[body]=heya") # # => { :bar => "nik", :post => { :body => "heya" } } - def query_parse(qs, d = '&;') - (qs||'').split(/[#{d}] */n).inject({}) { |h,p| + def query_parse(qs, d = '&;', preserve_order = false) + qh = preserve_order ? Dictionary.new : {} + (qs||'').split(/[#{d}] */n).inject(qh) { |h,p| key, value = unescape(p).split('=',2) normalize_params(h, key, value) - }.to_mash + } + preserve_order ? qh : qh.to_mash end NAME_REGEX = /Content-Disposition:.* name="?([^\";]*)"?/ni.freeze diff --git a/lib/merb-core/test/helpers/request_helper.rb b/lib/merb-core/test/helpers/request_helper.rb index 571b046..e702991 100644 --- a/lib/merb-core/test/helpers/request_helper.rb +++ b/lib/merb-core/test/helpers/request_helper.rb @@ -99,9 +99,8 @@ module Merb def dispatch_to(controller_klass, action, params = {}, env = {}, &blk) action = action.to_s request_body = { :post_body => env[:post_body], :req => env[:req] } - request = fake_request(env.merge( - :query_string => Merb::Request.params_to_query_string(params)), request_body) - + env = env.merge(:query_string => Merb::Request.params_to_query_string(params)) unless env.key?('QUERY_STRING') + request = fake_request(env, request_body) dispatch_request(request, controller_klass, action, &blk) end -- 1.5.5.1015.g9d258