Skip to content
Browse files

Update multipart tests to expose (another) bug in Rack's multipart pa…

…rser
  • Loading branch information...
1 parent 1adc149 commit 9775c25824feb35a5c42f3838d21c7e5faba9ca0 @josh josh committed Jan 13, 2009
View
1 actionpack/lib/action_controller.rb
@@ -33,6 +33,7 @@
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
View
11 actionpack/lib/action_controller/integration.rb
@@ -2,17 +2,6 @@
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
View
2 actionpack/lib/action_controller/middleware_stack.rb
@@ -32,6 +32,8 @@ def klass
else
@klass.to_s.constantize
end
+ rescue NameError
+ @klass
end
def active?
View
22 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
View
10 actionpack/lib/action_controller/rewindable_input.rb
@@ -15,15 +15,19 @@ def rewind
@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
View
2 actionpack/test/controller/request/multipart_params_parsing_test.rb
@@ -200,7 +200,7 @@ def call(env)
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
View
2 actionpack/test/controller/request/url_encoded_params_parsing_test.rb
@@ -183,7 +183,7 @@ def call(env)
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

0 comments on commit 9775c25

Please sign in to comment.
Something went wrong with that request. Please try again.