From 62ed6950c9119c12e6b17a68c79c45c77a7b1ca4 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Tue, 28 Jun 2005 17:42:51 +0000 Subject: Added support for upload progress indicators in Apache and lighttpd 1.4.x (won't work in WEBrick or lighttpd 1.3.x) #1475 [Sean Treadway] git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@1552 5ecf4fe2-1ee6-0310-87b1-e25e094e27de --- actionpack/lib/action_controller/base.rb | 14 ++++++++++- .../action_controller/cgi_ext/raw_post_data_fix.rb | 28 +++++++++++++++++----- 2 files changed, 35 insertions(+), 7 deletions(-) (limited to 'actionpack/lib/action_controller') diff --git a/actionpack/lib/action_controller/base.rb b/actionpack/lib/action_controller/base.rb index bd0e78719d..2e0d554a55 100755 --- a/actionpack/lib/action_controller/base.rb +++ b/actionpack/lib/action_controller/base.rb @@ -508,12 +508,24 @@ module ActionController #:nodoc: return result end - # Clears the rendered results, allowing for another render or redirect to be performed. + # Clears the rendered results, allowing for another render to be performed. def erase_render_results #:nodoc: @response.body = nil @performed_render = false end + # Clears the redirected results from the headers, resetting the status to 200 and returns + # the URL that was used to redirect or nil if there was no redirected URL + # Note that +redirect_to+ will change the body of the response to indicate a redirection. + # The response body is not reset here, see +erase_render_results+ + def erase_redirect_results #:nodoc: + @performed_redirect = false + response.redirected_to = nil + response.redirected_to_method_params = nil + response.headers['Status'] = DEFAULT_RENDER_STATUS_CODE + response.headers.delete('location') + end + def rewrite_options(options) if defaults = default_url_options(options) defaults.merge(options) 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 index 5cb13c2456..b2194eb07b 100644 --- a/actionpack/lib/action_controller/cgi_ext/raw_post_data_fix.rb +++ b/actionpack/lib/action_controller/cgi_ext/raw_post_data_fix.rb @@ -6,6 +6,8 @@ class CGI #:nodoc: # Handles multipart forms (in particular, forms that involve file uploads). # Reads query parameters in the @params field, and cookies into @cookies. def initialize_query() + @cookies = CGI::Cookie::parse((env_table['HTTP_COOKIE'] || env_table['COOKIE'])) + if boundary = multipart_form_boundary @multipart = true @params = read_multipart(boundary, Integer(env_table['CONTENT_LENGTH'])) @@ -13,8 +15,6 @@ class CGI #:nodoc: @multipart = false @params = CGI::parse(read_query_params || "") end - - @cookies = CGI::Cookie::parse((env_table['HTTP_COOKIE'] || env_table['COOKIE'])) end private @@ -28,16 +28,32 @@ class CGI #:nodoc: end end + def read_params_from_query + if defined? MOD_RUBY + Apache::request.args || '' + else + # fixes CGI querystring parsing for POSTs + if env_table['QUERY_STRING'].blank? && !env_table['REQUEST_URI'].blank? + env_table['QUERY_STRING'] = env_table['REQUEST_URI'].split('?', 2)[1] || '' + end + env_table['QUERY_STRING'] + end + end + + def read_params_from_post + stdinput.binmode if stdinput.respond_to?(:binmode) + content = stdinput.read(Integer(env_table['CONTENT_LENGTH'])) || '' + env_table['RAW_POST_DATA'] = content.split("&_").first.to_s.freeze # &_ is a fix for Safari Ajax postings that always append \000 + end + def read_query_params case env_table['REQUEST_METHOD'].to_s.upcase when 'CMD' read_from_cmdline when 'POST', 'PUT' - stdinput.binmode if stdinput.respond_to?(:binmode) - content = stdinput.read(Integer(env_table['CONTENT_LENGTH'])) || '' - env_table['RAW_POST_DATA'] = content.split("&_").first.to_s.freeze # &_ is a fix for Safari Ajax postings that always append \000 + read_params_from_post else # when 'GET', 'HEAD', 'DELETE', 'OPTIONS' - (defined?(MOD_RUBY) ? Apache::request.args : env_table['QUERY_STRING']) || '' + read_params_from_query end end end # module QueryExtension -- cgit v1.2.3