aboutsummaryrefslogtreecommitdiffstats
path: root/actionpack/lib/action_controller/cgi_ext/raw_post_data_fix.rb
diff options
context:
space:
mode:
Diffstat (limited to 'actionpack/lib/action_controller/cgi_ext/raw_post_data_fix.rb')
-rw-r--r--actionpack/lib/action_controller/cgi_ext/raw_post_data_fix.rb44
1 files changed, 44 insertions, 0 deletions
diff --git a/actionpack/lib/action_controller/cgi_ext/raw_post_data_fix.rb b/actionpack/lib/action_controller/cgi_ext/raw_post_data_fix.rb
new file mode 100644
index 0000000000..b494674c91
--- /dev/null
+++ b/actionpack/lib/action_controller/cgi_ext/raw_post_data_fix.rb
@@ -0,0 +1,44 @@
+class CGI #:nodoc:
+ # Add @request.env['RAW_POST_DATA'] for the vegans.
+ module QueryExtension
+ # Initialize the data from the query.
+ #
+ # Handles multipart forms (in particular, forms that involve file uploads).
+ # Reads query parameters in the @params field, and cookies into @cookies.
+ def initialize_query()
+ if boundary = multipart_form_boundary
+ @multipart = true
+ @params = read_multipart(boundary, Integer(env_table['CONTENT_LENGTH']))
+ else
+ @multipart = false
+ @params = CGI::parse(read_query_params)
+ end
+ end
+
+ private
+ def multipart_form_boundary
+ multipart_form_boundary_re = %r|\Amultipart/form-data.*boundary=\"?([^\";,]+)\"?|n # " ruby-mode
+
+ if env_table['REQUEST_METHOD'] == 'POST'
+ multipart_form_boundary_re.match(env_table['CONTENT_TYPE']).to_a.pop
+ end
+ end
+
+ def read_query_params
+ case env_table['REQUEST_METHOD']
+ when 'GET', 'HEAD'
+ if defined? MOD_RUBY
+ Apache::request.args or ''
+ else
+ env_table['QUERY_STRING'] or ''
+ end
+ when 'POST'
+ stdinput.binmode if stdinput.respond_to?(:binmode)
+ content = stdinput.read(Integer(env_table['CONTENT_LENGTH'])) or ''
+ env_table['RAW_POST_DATA'] = content.freeze
+ else
+ read_from_cmdline
+ end
+ end
+ end # module QueryExtension
+end \ No newline at end of file