mirror of
https://github.com/github/rails.git
synced 2026-01-25 14:28:28 -05:00
Automatically parse posted JSON content for Mime::JSON requests. [rick]
git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@9242 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
This commit is contained in:
@@ -1,5 +1,15 @@
|
||||
*SVN*
|
||||
|
||||
* Automatically parse posted JSON content for Mime::JSON requests. [rick]
|
||||
|
||||
POST /posts
|
||||
{"post": {"title": "Breaking News"}}
|
||||
|
||||
def create
|
||||
@post = Post.create params[:post]
|
||||
# ...
|
||||
end
|
||||
|
||||
* add json_escape ERB util to escape html entities in json strings that are output in HTML pages. [rick]
|
||||
|
||||
* Provide a helper proxy to access helper methods from outside views. Closes #10839 [Josh Peek]
|
||||
|
||||
@@ -316,9 +316,10 @@ module ActionController #:nodoc:
|
||||
# A YAML parser is also available and can be turned on with:
|
||||
#
|
||||
# ActionController::Base.param_parsers[Mime::YAML] = :yaml
|
||||
@@param_parsers = { Mime::MULTIPART_FORM => :multipart_form,
|
||||
@@param_parsers = { Mime::MULTIPART_FORM => :multipart_form,
|
||||
Mime::URL_ENCODED_FORM => :url_encoded_form,
|
||||
Mime::XML => :xml_simple }
|
||||
Mime::XML => :xml_simple,
|
||||
Mime::JSON => :json }
|
||||
cattr_accessor :param_parsers
|
||||
|
||||
# Controls the default charset for all renders.
|
||||
|
||||
@@ -402,6 +402,14 @@ EOM
|
||||
body.blank? ? {} : Hash.from_xml(body).with_indifferent_access
|
||||
when :yaml
|
||||
YAML.load(body)
|
||||
when :json
|
||||
if body.blank?
|
||||
{}
|
||||
else
|
||||
data = ActiveSupport::JSON.decode(body)
|
||||
data = {:_json => data} unless data.is_a?(Hash)
|
||||
data.with_indifferent_access
|
||||
end
|
||||
else
|
||||
{}
|
||||
end
|
||||
@@ -507,7 +515,6 @@ EOM
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
MULTIPART_BOUNDARY = %r|\Amultipart/form-data.*boundary=\"?([^\";,]+)\"?|n
|
||||
|
||||
EOL = "\015\012"
|
||||
@@ -604,12 +611,12 @@ EOM
|
||||
end
|
||||
raise EOFError, "bad boundary end of body part" unless boundary_end=~/--/
|
||||
|
||||
begin
|
||||
begin
|
||||
body.rewind if body.respond_to?(:rewind)
|
||||
rescue Errno::ESPIPE
|
||||
rescue Errno::ESPIPE
|
||||
# Handles exceptions raised by input streams that cannot be rewound
|
||||
# such as when using plain CGI under Apache
|
||||
end
|
||||
end
|
||||
|
||||
params
|
||||
end
|
||||
|
||||
@@ -3,7 +3,7 @@ require 'erb'
|
||||
class ERB
|
||||
module Util
|
||||
HTML_ESCAPE = { '&' => '&', '>' => '>', '<' => '<', '"' => '"' }
|
||||
JSON_ESCAPE = { '&' => '\u0026', '>' => '\u003E', '<' => '\u003C'}
|
||||
JSON_ESCAPE = { '&' => '\u0026', '>' => '\u003E', '<' => '\u003C' }
|
||||
|
||||
# A utility method for escaping HTML tag characters.
|
||||
# This method is also aliased as <tt>h</tt>.
|
||||
|
||||
@@ -851,8 +851,13 @@ class MultipartRequestParameterParsingTest < Test::Unit::TestCase
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
class XmlParamsParsingTest < Test::Unit::TestCase
|
||||
def test_hash_params
|
||||
person = parse_body("<person><name>David</name></person>")[:person]
|
||||
assert_kind_of Hash, person
|
||||
assert_equal 'David', person['name']
|
||||
end
|
||||
|
||||
def test_single_file
|
||||
person = parse_body("<person><name>David</name><avatar type='file' name='me.jpg' content_type='image/jpg'>#{ActiveSupport::Base64.encode64('ABC')}</avatar></person>")
|
||||
|
||||
@@ -899,3 +904,19 @@ class LegacyXmlParamsParsingTest < XmlParamsParsingTest
|
||||
ActionController::CgiRequest.new(cgi).request_parameters
|
||||
end
|
||||
end
|
||||
|
||||
class JsonParamsParsingTest < Test::Unit::TestCase
|
||||
def test_hash_params
|
||||
person = parse_body({:person => {:name => "David"}}.to_json)[:person]
|
||||
assert_kind_of Hash, person
|
||||
assert_equal 'David', person['name']
|
||||
end
|
||||
|
||||
private
|
||||
def parse_body(body)
|
||||
env = { 'CONTENT_TYPE' => 'application/json',
|
||||
'CONTENT_LENGTH' => body.size.to_s }
|
||||
cgi = ActionController::Integration::Session::StubCGI.new(env, body)
|
||||
ActionController::CgiRequest.new(cgi).request_parameters
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user