~michaelforrest/use-case-mapper/trunk

« back to all changes in this revision

Viewing changes to vendor/rails/actionpack/lib/action_controller/params_parser.rb

  • Committer: Richard Lee (Canonical)
  • Date: 2010-10-15 15:17:58 UTC
  • mfrom: (190.1.3 use-case-mapper)
  • Revision ID: richard.lee@canonical.com-20101015151758-wcvmfxrexsongf9d
Merge

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
module ActionController
2
 
  class ParamsParser
3
 
    ActionController::Base.param_parsers[Mime::XML] = :xml_simple
4
 
    ActionController::Base.param_parsers[Mime::JSON] = :json
5
 
 
6
 
    def initialize(app)
7
 
      @app = app
8
 
    end
9
 
 
10
 
    def call(env)
11
 
      if params = parse_formatted_parameters(env)
12
 
        env["action_controller.request.request_parameters"] = params
13
 
      end
14
 
 
15
 
      @app.call(env)
16
 
    end
17
 
 
18
 
    private
19
 
      def parse_formatted_parameters(env)
20
 
        request = Request.new(env)
21
 
 
22
 
        return false if request.content_length.zero?
23
 
 
24
 
        mime_type = content_type_from_legacy_post_data_format_header(env) || request.content_type
25
 
        strategy = ActionController::Base.param_parsers[mime_type]
26
 
 
27
 
        return false unless strategy
28
 
 
29
 
        case strategy
30
 
          when Proc
31
 
            strategy.call(request.raw_post)
32
 
          when :xml_simple, :xml_node
33
 
            body = request.raw_post
34
 
            body.blank? ? {} : Hash.from_xml(body).with_indifferent_access
35
 
          when :yaml
36
 
            YAML.load(request.raw_post)
37
 
          when :json
38
 
            body = request.raw_post
39
 
            if body.blank?
40
 
              {}
41
 
            else
42
 
              data = ActiveSupport::JSON.decode(body)
43
 
              data = {:_json => data} unless data.is_a?(Hash)
44
 
              data.with_indifferent_access
45
 
            end
46
 
          else
47
 
            false
48
 
        end
49
 
      rescue Exception => e # YAML, XML or Ruby code block errors
50
 
        logger.debug "Error occurred while parsing request parameters.\nContents:\n\n#{request.raw_post}"
51
 
 
52
 
        raise
53
 
          { "body" => request.raw_post,
54
 
            "content_type" => request.content_type,
55
 
            "content_length" => request.content_length,
56
 
            "exception" => "#{e.message} (#{e.class})",
57
 
            "backtrace" => e.backtrace }
58
 
      end
59
 
 
60
 
      def content_type_from_legacy_post_data_format_header(env)
61
 
        if x_post_format = env['HTTP_X_POST_DATA_FORMAT']
62
 
          case x_post_format.to_s.downcase
63
 
            when 'yaml'
64
 
              return Mime::YAML
65
 
            when 'xml'
66
 
              return Mime::XML
67
 
          end
68
 
        end
69
 
 
70
 
        nil
71
 
      end
72
 
 
73
 
      def logger
74
 
        defined?(Rails.logger) ? Rails.logger : Logger.new($stderr)
75
 
      end
76
 
  end
77
 
end