aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoshua Peek <josh@joshpeek.com>2009-01-13 17:21:45 -0600
committerJoshua Peek <josh@joshpeek.com>2009-01-13 17:21:45 -0600
commit9775c25824feb35a5c42f3838d21c7e5faba9ca0 (patch)
treeafbb65ffadbd8d16d5ed787aa3c95553e059f322
parent1adc1496f9152c893e1f08abcb1e5e7272829899 (diff)
downloadrails-9775c25824feb35a5c42f3838d21c7e5faba9ca0.tar.gz
rails-9775c25824feb35a5c42f3838d21c7e5faba9ca0.tar.bz2
rails-9775c25824feb35a5c42f3838d21c7e5faba9ca0.zip
Update multipart tests to expose (another) bug in Rack's multipart parser
-rw-r--r--actionpack/lib/action_controller.rb1
-rw-r--r--actionpack/lib/action_controller/integration.rb11
-rw-r--r--actionpack/lib/action_controller/middleware_stack.rb2
-rw-r--r--actionpack/lib/action_controller/rack_ext.rb22
-rw-r--r--actionpack/lib/action_controller/rewindable_input.rb10
-rw-r--r--actionpack/test/controller/request/multipart_params_parsing_test.rb2
-rw-r--r--actionpack/test/controller/request/url_encoded_params_parsing_test.rb2
7 files changed, 34 insertions, 16 deletions
diff --git a/actionpack/lib/action_controller.rb b/actionpack/lib/action_controller.rb
index 0d81b9c346..a9cd09e58d 100644
--- a/actionpack/lib/action_controller.rb
+++ b/actionpack/lib/action_controller.rb
@@ -33,6 +33,7 @@ end
gem 'rack', '>= 0.9.0'
require 'rack'
+require 'action_controller/rack_ext'
module ActionController
# TODO: Review explicit to see if they will automatically be handled by
diff --git a/actionpack/lib/action_controller/integration.rb b/actionpack/lib/action_controller/integration.rb
index 5b08e30d49..163ba84a3e 100644
--- a/actionpack/lib/action_controller/integration.rb
+++ b/actionpack/lib/action_controller/integration.rb
@@ -2,17 +2,6 @@ require 'stringio'
require 'uri'
require 'active_support/test_case'
-# Monkey patch Rack::Lint to support rewind
-module Rack
- class Lint
- class InputWrapper
- def rewind
- @input.rewind
- end
- end
- end
-end
-
module ActionController
module Integration #:nodoc:
# An integration Session instance represents a set of requests and responses
diff --git a/actionpack/lib/action_controller/middleware_stack.rb b/actionpack/lib/action_controller/middleware_stack.rb
index 2bccba2ba1..b94bf6ec4a 100644
--- a/actionpack/lib/action_controller/middleware_stack.rb
+++ b/actionpack/lib/action_controller/middleware_stack.rb
@@ -32,6 +32,8 @@ module ActionController
else
@klass.to_s.constantize
end
+ rescue NameError
+ @klass
end
def active?
diff --git a/actionpack/lib/action_controller/rack_ext.rb b/actionpack/lib/action_controller/rack_ext.rb
new file mode 100644
index 0000000000..3b142307e9
--- /dev/null
+++ b/actionpack/lib/action_controller/rack_ext.rb
@@ -0,0 +1,22 @@
+module Rack
+ module Utils
+ module Multipart
+ class << self
+ def parse_multipart_with_rewind(env)
+ result = parse_multipart_without_rewind(env)
+
+ begin
+ env['rack.input'].rewind if env['rack.input'].respond_to?(:rewind)
+ rescue Errno::ESPIPE
+ # Handles exceptions raised by input streams that cannot be rewound
+ # such as when using plain CGI under Apache
+ end
+
+ result
+ end
+
+ alias_method_chain :parse_multipart, :rewind
+ end
+ end
+ end
+end
diff --git a/actionpack/lib/action_controller/rewindable_input.rb b/actionpack/lib/action_controller/rewindable_input.rb
index 296d8aed22..058453ea68 100644
--- a/actionpack/lib/action_controller/rewindable_input.rb
+++ b/actionpack/lib/action_controller/rewindable_input.rb
@@ -15,15 +15,19 @@ module ActionController
@io.rewind
end
+ def string
+ @string
+ end
+
def method_missing(method, *args, &block)
@io.send(method, *args, &block)
end
private
def read_original_io
- unless @str
- @str = @io.read
- @io = StringIO.new(@str)
+ unless @string
+ @string = @io.read
+ @io = StringIO.new(@string)
end
end
end
diff --git a/actionpack/test/controller/request/multipart_params_parsing_test.rb b/actionpack/test/controller/request/multipart_params_parsing_test.rb
index d976ab8512..137fdbee54 100644
--- a/actionpack/test/controller/request/multipart_params_parsing_test.rb
+++ b/actionpack/test/controller/request/multipart_params_parsing_test.rb
@@ -200,7 +200,7 @@ class MultipartParamsParsingTest < ActionController::IntegrationTest
def with_muck_middleware
original_middleware = ActionController::Dispatcher.middleware
middleware = original_middleware.dup
- middleware.use MuckMiddleware
+ middleware.insert_after ActionController::RewindableInput, MuckMiddleware
ActionController::Dispatcher.middleware = middleware
yield
ActionController::Dispatcher.middleware = original_middleware
diff --git a/actionpack/test/controller/request/url_encoded_params_parsing_test.rb b/actionpack/test/controller/request/url_encoded_params_parsing_test.rb
index b162796e5b..ee2a239d50 100644
--- a/actionpack/test/controller/request/url_encoded_params_parsing_test.rb
+++ b/actionpack/test/controller/request/url_encoded_params_parsing_test.rb
@@ -183,7 +183,7 @@ class UrlEncodedParamsParsingTest < ActionController::IntegrationTest
def with_muck_middleware
original_middleware = ActionController::Dispatcher.middleware
middleware = original_middleware.dup
- middleware.use MuckMiddleware
+ middleware.insert_after ActionController::RewindableInput, MuckMiddleware
ActionController::Dispatcher.middleware = middleware
yield
ActionController::Dispatcher.middleware = original_middleware