From bae92681be97191edda90990e08b5275d187107f Mon Sep 17 00:00:00 2001 From: Dylan Smith Date: Wed, 9 Jan 2013 15:26:12 -0500 Subject: [PATCH] Fix json params parsing regression for non-object JSON content. Fixes #8845. --- actionpack/CHANGELOG.md | 4 ++++ actionpack/lib/action_dispatch/middleware/params_parser.rb | 4 ++-- .../test/dispatch/request/json_params_parsing_test.rb | 7 +++++++ 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/actionpack/CHANGELOG.md b/actionpack/CHANGELOG.md index 7dea0e7fa5833..2cb7af05e5214 100644 --- a/actionpack/CHANGELOG.md +++ b/actionpack/CHANGELOG.md @@ -1,5 +1,9 @@ ## Rails 4.0.0 (unreleased) ## +* Fixed json params parsing regression for non-object JSON content. + + *Dylan Smith* + * Extract `ActionDispatch::PerformanceTest` into https://github.com/rails/rails-perftest You can add the gem to your Gemfile to keep using performance tests. diff --git a/actionpack/lib/action_dispatch/middleware/params_parser.rb b/actionpack/lib/action_dispatch/middleware/params_parser.rb index a3291bb7ad738..0898ad82dd29a 100644 --- a/actionpack/lib/action_dispatch/middleware/params_parser.rb +++ b/actionpack/lib/action_dispatch/middleware/params_parser.rb @@ -50,9 +50,9 @@ def parse_formatted_parameters(env) data = request.deep_munge(Hash.from_xml(request.body.read) || {}) data.with_indifferent_access when :json - data = request.deep_munge ActiveSupport::JSON.decode(request.body) + data = ActiveSupport::JSON.decode(request.body) data = {:_json => data} unless data.is_a?(Hash) - data.with_indifferent_access + request.deep_munge(data).with_indifferent_access else false end diff --git a/actionpack/test/dispatch/request/json_params_parsing_test.rb b/actionpack/test/dispatch/request/json_params_parsing_test.rb index 2c4a6c2147f0c..7d3fc84089da0 100644 --- a/actionpack/test/dispatch/request/json_params_parsing_test.rb +++ b/actionpack/test/dispatch/request/json_params_parsing_test.rb @@ -122,6 +122,13 @@ def teardown ) end + test "parses json with non-object JSON content" do + assert_parses( + {"user" => {"_json" => "string content" }, "_json" => "string content" }, + "\"string content\"", { 'CONTENT_TYPE' => 'application/json' } + ) + end + private def assert_parses(expected, actual, headers = {}) with_test_routing(UsersController) do