diff options
author | Simon Chiang <simon.a.chiang@gmail.com> | 2009-05-15 22:53:04 +0800 |
---|---|---|
committer | Joshua Peek <josh@joshpeek.com> | 2009-05-16 00:14:35 +0800 |
commit | 1189b1e7f11aa62b8c5ff25441bfdac186fadcc1 (patch) | |
tree | 268366c7bd565cf16e9b0d7c0d5089e978d58872 | |
parent | 0bf8d8e840ae226d6efed8af345feb67a10f6aa6 (diff) | |
download | rack-1189b1e7f11aa62b8c5ff25441bfdac186fadcc1.tar.gz |
optimizations of parse/build query
Signed-off-by: Joshua Peek <josh@joshpeek.com>
-rw-r--r-- | lib/rack/utils.rb | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/lib/rack/utils.rb b/lib/rack/utils.rb index 42e2e698..050d381c 100644 --- a/lib/rack/utils.rb +++ b/lib/rack/utils.rb @@ -26,15 +26,17 @@ module Rack end module_function :unescape + DEFAULT_SEP = /[&;] */n + # Stolen from Mongrel, with some small modifications: # Parses a query string by breaking it up at the '&' # and ';' characters. You can also use this to parse # cookies by changing the characters used in the second # parameter (which defaults to '&;'). - def parse_query(qs, d = '&;') + def parse_query(qs, d = nil) params = {} - (qs || '').split(/[#{d}] */n).each do |p| + (qs || '').split(d ? /[#{d}] */n : DEFAULT_SEP).each do |p| k, v = unescape(p).split('=', 2) if cur = params[k] @@ -52,10 +54,10 @@ module Rack end module_function :parse_query - def parse_nested_query(qs, d = '&;') + def parse_nested_query(qs, d = nil) params = {} - (qs || '').split(/[#{d}] */n).each do |p| + (qs || '').split(d ? /[#{d}] */n : DEFAULT_SEP).each do |p| k, v = unescape(p).split('=', 2) normalize_params(params, k, v) end @@ -101,7 +103,7 @@ module Rack if v.class == Array build_query(v.map { |x| [k, x] }) else - escape(k) + "=" + escape(v) + "#{escape(k)}=#{escape(v)}" end }.join("&") end |