diff --git a/actionpack/lib/action_controller/request.rb b/actionpack/lib/action_controller/request.rb index 5e492e3..8c50874 100755 --- a/actionpack/lib/action_controller/request.rb +++ b/actionpack/lib/action_controller/request.rb @@ -492,10 +492,13 @@ EOM case strategy when Proc - strategy.call(body) + if strategy.arity == 4 + strategy.call(body, boundary, content_length, env) + else + strategy.call(body) + end when :url_encoded_form - self.class.clean_up_ajax_request_body! body - self.class.parse_query_parameters(body) + self.class.parse_url_encoded_form_parameters(body) when :multipart_form self.class.parse_multipart_form_parameters(body, boundary, content_length, env) when :xml_simple, :xml_node @@ -528,6 +531,10 @@ EOM class << self def parse_query_parameters(query_string) + parse_query_parameters_with_parser(UrlEncodedPairParser, query_string) + end + + def parse_query_parameters_with_parser(parser_class, query_string) return {} if query_string.blank? pairs = query_string.split('&').collect do |chunk| @@ -538,11 +545,24 @@ EOM [ CGI.unescape(key), value ] end.compact - UrlEncodedPairParser.new(pairs).result + parser_class.new(pairs).result + end + + def parse_url_encoded_form_parameters(query_string) + parse_url_encoded_form_parameters_with_parser(UrlEncodedPairParser, query_string) + end + + def parse_url_encoded_form_parameters_with_parser(parser_class, query_string) + clean_up_ajax_request_body! query_string + parse_query_parameters_with_parser(parser_class, query_string) end def parse_request_parameters(params) - parser = UrlEncodedPairParser.new + parse_request_parameters_with_parser(UrlEncodedPairParser, params) + end + + def parse_request_parameters_with_parser(parser_class, params) + parser = parser_class.new params = params.dup until params.empty? @@ -567,7 +587,13 @@ EOM end def parse_multipart_form_parameters(body, boundary, body_size, env) - parse_request_parameters(read_multipart(body, boundary, body_size, env)) + parser_class = UrlEncodedPairParser + parse_multipart_form_parameters_with_parser(parser_class, body, boundary, body_size, env) + end + + def parse_multipart_form_parameters_with_parser(parser_class, body, boundary, body_size, env) + params = read_multipart(body, boundary, body_size, env) + parse_request_parameters_with_parser(parser_class, params) end def extract_multipart_boundary(content_type_with_parameters)