mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Coerce all out going body parts to Strings
This commit is contained in:
parent
570f055c44
commit
b480da5cd6
5 changed files with 72 additions and 0 deletions
|
@ -39,6 +39,7 @@ module ActionDispatch
|
||||||
autoload :Rescue, 'action_dispatch/middleware/rescue'
|
autoload :Rescue, 'action_dispatch/middleware/rescue'
|
||||||
autoload :ShowExceptions, 'action_dispatch/middleware/show_exceptions'
|
autoload :ShowExceptions, 'action_dispatch/middleware/show_exceptions'
|
||||||
autoload :Static, 'action_dispatch/middleware/static'
|
autoload :Static, 'action_dispatch/middleware/static'
|
||||||
|
autoload :StringCoercion, 'action_dispatch/middleware/string_coercion'
|
||||||
|
|
||||||
autoload :Assertions, 'action_dispatch/testing/assertions'
|
autoload :Assertions, 'action_dispatch/testing/assertions'
|
||||||
autoload :Integration, 'action_dispatch/testing/integration'
|
autoload :Integration, 'action_dispatch/testing/integration'
|
||||||
|
|
29
actionpack/lib/action_dispatch/middleware/string_coercion.rb
Normal file
29
actionpack/lib/action_dispatch/middleware/string_coercion.rb
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
module ActionDispatch
|
||||||
|
class StringCoercion
|
||||||
|
class UglyBody < ActiveSupport::BasicObject
|
||||||
|
def initialize(body)
|
||||||
|
@body = body
|
||||||
|
end
|
||||||
|
|
||||||
|
def each
|
||||||
|
@body.each do |part|
|
||||||
|
yield part.to_s
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
def method_missing(*args, &block)
|
||||||
|
@body.__send__(*args, &block)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def initialize(app)
|
||||||
|
@app = app
|
||||||
|
end
|
||||||
|
|
||||||
|
def call(env)
|
||||||
|
status, headers, body = @app.call(env)
|
||||||
|
[status, headers, UglyBody.new(body)]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -93,6 +93,7 @@ end
|
||||||
class ActionController::IntegrationTest < ActiveSupport::TestCase
|
class ActionController::IntegrationTest < ActiveSupport::TestCase
|
||||||
def self.build_app(routes = nil)
|
def self.build_app(routes = nil)
|
||||||
ActionDispatch::MiddlewareStack.new { |middleware|
|
ActionDispatch::MiddlewareStack.new { |middleware|
|
||||||
|
middleware.use "ActionDispatch::StringCoercion"
|
||||||
middleware.use "ActionDispatch::ShowExceptions"
|
middleware.use "ActionDispatch::ShowExceptions"
|
||||||
middleware.use "ActionDispatch::Callbacks"
|
middleware.use "ActionDispatch::Callbacks"
|
||||||
middleware.use "ActionDispatch::ParamsParser"
|
middleware.use "ActionDispatch::ParamsParser"
|
||||||
|
|
40
actionpack/test/dispatch/string_coercion_test.rb
Normal file
40
actionpack/test/dispatch/string_coercion_test.rb
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
require 'abstract_unit'
|
||||||
|
|
||||||
|
class StringCoercionTest < ActiveSupport::TestCase
|
||||||
|
test "body responds to each" do
|
||||||
|
original_body = []
|
||||||
|
body = ActionDispatch::StringCoercion::UglyBody.new(original_body)
|
||||||
|
|
||||||
|
assert original_body.respond_to?(:each)
|
||||||
|
assert body.respond_to?(:each)
|
||||||
|
end
|
||||||
|
|
||||||
|
test "body responds to to_path" do
|
||||||
|
original_body = []
|
||||||
|
def original_body.to_path; end
|
||||||
|
body = ActionDispatch::StringCoercion::UglyBody.new(original_body)
|
||||||
|
|
||||||
|
assert original_body.respond_to?(:to_path)
|
||||||
|
assert body.respond_to?(:to_path)
|
||||||
|
end
|
||||||
|
|
||||||
|
test "body does not responds to to_path" do
|
||||||
|
original_body = []
|
||||||
|
body = ActionDispatch::StringCoercion::UglyBody.new(original_body)
|
||||||
|
|
||||||
|
assert !original_body.respond_to?(:to_path)
|
||||||
|
assert !body.respond_to?(:to_path)
|
||||||
|
end
|
||||||
|
|
||||||
|
test "calls to_s on body parts" do
|
||||||
|
app = lambda { |env|
|
||||||
|
[200, {'Content-Type' => 'html'}, [1, 2, 3]]
|
||||||
|
}
|
||||||
|
app = ActionDispatch::StringCoercion.new(app)
|
||||||
|
parts = []
|
||||||
|
status, headers, body = app.call({})
|
||||||
|
body.each { |part| parts << part }
|
||||||
|
|
||||||
|
assert_equal %w( 1 2 3 ), parts
|
||||||
|
end
|
||||||
|
end
|
|
@ -271,6 +271,7 @@ module Rails
|
||||||
configuration.middleware.use(ActionDispatch::ParamsParser)
|
configuration.middleware.use(ActionDispatch::ParamsParser)
|
||||||
configuration.middleware.use(::Rack::MethodOverride)
|
configuration.middleware.use(::Rack::MethodOverride)
|
||||||
configuration.middleware.use(::Rack::Head)
|
configuration.middleware.use(::Rack::Head)
|
||||||
|
configuration.middleware.use(ActionDispatch::StringCoercion)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue