From c7c7ac2f4c52095879281a7e0428e0f0c9921902 Mon Sep 17 00:00:00 2001 From: Rob Date: Wed, 18 Mar 2009 11:28:41 +0000 Subject: [PATCH] Added extra nested params error handling and added messages to exceptions to help with debugging --- lib/rack/utils.rb | 5 +++-- test/spec_rack_utils.rb | 13 +++++++++++-- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/lib/rack/utils.rb b/lib/rack/utils.rb index 0a61bce..7acc10d 100644 --- a/lib/rack/utils.rb +++ b/lib/rack/utils.rb @@ -73,12 +73,12 @@ module Rack params[k] = v elsif after == "[]" params[k] ||= [] - raise TypeError unless params[k].is_a?(Array) + 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 unless params[k].is_a?(Array) + 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 @@ -86,6 +86,7 @@ module Rack 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 diff --git a/test/spec_rack_utils.rb b/test/spec_rack_utils.rb index 9bd8904..2ac563b 100644 --- a/test/spec_rack_utils.rb +++ b/test/spec_rack_utils.rb @@ -93,8 +93,17 @@ context "Rack::Utils" do Rack::Utils.parse_nested_query("x[y][][z]=1&x[y][][w]=a&x[y][][z]=2&x[y][][w]=3"). should.equal "x" => {"y" => [{"z" => "1", "w" => "a"}, {"z" => "2", "w" => "3"}]} - lambda { Rack::Utils.parse_nested_query("foo[bar]=1&foo[]=1") }. - should.raise TypeError + lambda { Rack::Utils.parse_nested_query("x[y]=1&x[y]z=2") }. + should.raise(TypeError). + message.should.equal "expected Hash (got String) for param `y'" + + lambda { Rack::Utils.parse_nested_query("x[y]=1&x[]=1") }. + should.raise(TypeError). + message.should.equal "expected Array (got Hash) for param `x'" + + lambda { Rack::Utils.parse_nested_query("x[y]=1&x[y][][w]=2") }. + should.raise(TypeError). + message.should.equal "expected Array (got String) for param `y'" end specify "should build query strings correctly" do -- 1.6.2.1217.gd7bc3