From 2429074075b08b219f4dbbe8f6d08598c1d67878 Mon Sep 17 00:00:00 2001 From: Jamis Buck Date: Wed, 15 Mar 2006 21:46:41 +0000 Subject: Underscore dasherized keys in formatted requests git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@3878 5ecf4fe2-1ee6-0310-87b1-e25e094e27de --- actionpack/CHANGELOG | 2 ++ .../lib/action_controller/cgi_ext/cgi_methods.rb | 14 +++++++++- actionpack/lib/action_controller/mime_responds.rb | 2 +- actionpack/test/controller/webservice_test.rb | 31 +++++++++++++++++++--- 4 files changed, 44 insertions(+), 5 deletions(-) (limited to 'actionpack') diff --git a/actionpack/CHANGELOG b/actionpack/CHANGELOG index 94c0a6bf95..96eb8ac77d 100644 --- a/actionpack/CHANGELOG +++ b/actionpack/CHANGELOG @@ -1,5 +1,7 @@ *SVN* +* Underscore dasherized keys in formatted requests [Jamis Buck] + * Add MimeResponds::Responder#any for managing multiple types with identical responses [Jamis Buck] * Make the xml_http_request testing method set the HTTP_ACCEPT header [Jamis Buck] diff --git a/actionpack/lib/action_controller/cgi_ext/cgi_methods.rb b/actionpack/lib/action_controller/cgi_ext/cgi_methods.rb index f092a41d47..cd70836c6e 100755 --- a/actionpack/lib/action_controller/cgi_ext/cgi_methods.rb +++ b/actionpack/lib/action_controller/cgi_ext/cgi_methods.rb @@ -71,7 +71,7 @@ class CGIMethods #:nodoc: { node.node_name => node } end - params || {} + dasherize_keys(params || {}) rescue Object => e { "exception" => "#{e.message} (#{e.class})", "backtrace" => e.backtrace, "raw_post_data" => raw_post_data, "format" => mime_type } @@ -79,6 +79,18 @@ class CGIMethods #:nodoc: private + def self.dasherize_keys(params) + case params.class.to_s + when "Hash" + params.inject({}) do |h,(k,v)| + h[k.tr("-", "_")] = dasherize_keys(v) + h + end + else + params + end + end + # Splits the given key into several pieces. Example keys are 'name', 'person[name]', # 'person[name][first]', and 'people[]'. In each instance, an Array instance is returned. # 'person[name][first]' produces ['person', 'name', 'first']; 'people[]' produces ['people', ''] diff --git a/actionpack/lib/action_controller/mime_responds.rb b/actionpack/lib/action_controller/mime_responds.rb index 04ec1e5dd8..140209a225 100644 --- a/actionpack/lib/action_controller/mime_responds.rb +++ b/actionpack/lib/action_controller/mime_responds.rb @@ -36,7 +36,7 @@ module ActionController #:nodoc: @responses[mime_type] = block else if argument = args.first - eval("__mime_responder_arg__ = " + (argument.is_a?(String) ? "'" + argument + "'" : argument), @block_binding) + eval("__mime_responder_arg__ = #{argument.is_a?(String) ? argument.inspect : argument}", @block_binding) @responses[mime_type] = eval(DEFAULT_BLOCKS[(mime_type.to_sym.to_s + "_arg").to_sym], @block_binding) else @responses[mime_type] = eval(DEFAULT_BLOCKS[mime_type.to_sym], @block_binding) diff --git a/actionpack/test/controller/webservice_test.rb b/actionpack/test/controller/webservice_test.rb index c99abeaa9e..90691e9e9c 100644 --- a/actionpack/test/controller/webservice_test.rb +++ b/actionpack/test/controller/webservice_test.rb @@ -19,7 +19,20 @@ class WebServiceTest < Test::Unit::TestCase session :off def assign_parameters - render :text => (@params.keys - ['controller', 'action']).sort.join(", ") + if params[:full] + render :text => dump_params_keys + else + render :text => (params.keys - ['controller', 'action']).sort.join(", ") + end + end + + def dump_params_keys(hash=params) + hash.keys.sort.inject("") do |s, k| + value = hash[k] + value = Hash === value ? "(#{dump_params_keys(value)})" : "" + s << ", " unless s.empty? + s << "#{k}#{value}" + end end def rescue_action(e) raise end @@ -88,16 +101,28 @@ class WebServiceTest < Test::Unit::TestCase assert_equal true, @controller.request.yaml_post? assert_equal false, @controller.request.xml_post? end + + def test_dasherized_keys_as_xml + ActionController::Base.param_parsers[Mime::XML] = :xml_simple + process('POST', 'application/xml', "\n...\n", true) + assert_equal 'action, controller, first_key(sub_key), full', @controller.response.body + end + + def test_dasherized_keys_as_yaml + ActionController::Base.param_parsers[Mime::YAML] = :yaml + process('POST', 'application/x-yaml', "---\nfirst-key:\n sub-key: ...\n", true) + assert_equal 'action, controller, first_key(sub_key), full', @controller.response.body + end private - def process(verb, content_type = 'application/x-www-form-urlencoded', data = '') + def process(verb, content_type = 'application/x-www-form-urlencoded', data = '', full=false) cgi = MockCGI.new({ 'REQUEST_METHOD' => verb, 'CONTENT_TYPE' => content_type, - 'QUERY_STRING' => "action=assign_parameters&controller=webservicetest/test", + 'QUERY_STRING' => "action=assign_parameters&controller=webservicetest/test#{"&full=1" if full}", "REQUEST_URI" => "/", "HTTP_HOST" => 'testdomain.com', "CONTENT_LENGTH" => data.size, -- cgit v1.2.3