mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Use a BodyProxy instead of including a Module that responds to close.
Closes #4441 if Active Record is disabled assets are delivered correctly
This commit is contained in:
parent
161c857b9b
commit
29fdd8c777
5 changed files with 49 additions and 15 deletions
|
@ -4,6 +4,10 @@
|
||||||
|
|
||||||
## Rails 3.2.0 (unreleased) ##
|
## Rails 3.2.0 (unreleased) ##
|
||||||
|
|
||||||
|
* Use a BodyProxy instead of including a Module that responds to
|
||||||
|
close. Closes #4441 if Active Record is disabled assets are delivered
|
||||||
|
correctly *Santiago Pastorino*
|
||||||
|
|
||||||
* Rails initialization with initialize_on_precompile = false should set assets_dir *Santiago Pastorino*
|
* Rails initialization with initialize_on_precompile = false should set assets_dir *Santiago Pastorino*
|
||||||
|
|
||||||
* Add font_path helper method *Santiago Pastorino*
|
* Add font_path helper method *Santiago Pastorino*
|
||||||
|
|
28
actionpack/lib/action_dispatch/middleware/body_proxy.rb
Normal file
28
actionpack/lib/action_dispatch/middleware/body_proxy.rb
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
# Keep this file meanwhile https://github.com/rack/rack/pull/313 is not released
|
||||||
|
module ActionDispatch
|
||||||
|
class BodyProxy
|
||||||
|
def initialize(body, &block)
|
||||||
|
@body, @block, @closed = body, block, false
|
||||||
|
end
|
||||||
|
|
||||||
|
def respond_to?(*args)
|
||||||
|
super or @body.respond_to?(*args)
|
||||||
|
end
|
||||||
|
|
||||||
|
def close
|
||||||
|
return if @closed
|
||||||
|
@closed = true
|
||||||
|
@body.close if @body.respond_to? :close
|
||||||
|
ensure
|
||||||
|
@block.call
|
||||||
|
end
|
||||||
|
|
||||||
|
def closed?
|
||||||
|
@closed
|
||||||
|
end
|
||||||
|
|
||||||
|
def method_missing(*args, &block)
|
||||||
|
@body.__send__(*args, &block)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -1,3 +1,5 @@
|
||||||
|
require 'action_dispatch/middleware/body_proxy'
|
||||||
|
|
||||||
module ActionDispatch
|
module ActionDispatch
|
||||||
# ActionDispatch::Reloader provides prepare and cleanup callbacks,
|
# ActionDispatch::Reloader provides prepare and cleanup callbacks,
|
||||||
# intended to assist with code reloading during development.
|
# intended to assist with code reloading during development.
|
||||||
|
@ -61,7 +63,7 @@ module ActionDispatch
|
||||||
@validated = @condition.call
|
@validated = @condition.call
|
||||||
prepare!
|
prepare!
|
||||||
response = @app.call(env)
|
response = @app.call(env)
|
||||||
response[2].extend(module_hook)
|
response[2] = ActionDispatch::BodyProxy.new(response[2]) { cleanup! }
|
||||||
response
|
response
|
||||||
rescue Exception
|
rescue Exception
|
||||||
cleanup!
|
cleanup!
|
||||||
|
@ -83,18 +85,5 @@ module ActionDispatch
|
||||||
def validated? #:nodoc:
|
def validated? #:nodoc:
|
||||||
@validated
|
@validated
|
||||||
end
|
end
|
||||||
|
|
||||||
def module_hook #:nodoc:
|
|
||||||
middleware = self
|
|
||||||
Module.new do
|
|
||||||
define_method :close do
|
|
||||||
begin
|
|
||||||
super() if defined?(super)
|
|
||||||
ensure
|
|
||||||
middleware.cleanup!
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -43,6 +43,16 @@ class ReloaderTest < ActiveSupport::TestCase
|
||||||
assert_respond_to body, :close
|
assert_respond_to body, :close
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_returned_body_object_always_responds_to_close_even_if_called_twice
|
||||||
|
body = call_and_return_body
|
||||||
|
assert_respond_to body, :close
|
||||||
|
body.close
|
||||||
|
|
||||||
|
body = call_and_return_body
|
||||||
|
assert_respond_to body, :close
|
||||||
|
body.close
|
||||||
|
end
|
||||||
|
|
||||||
def test_condition_specifies_when_to_reload
|
def test_condition_specifies_when_to_reload
|
||||||
i, j = 0, 0, 0, 0
|
i, j = 0, 0, 0, 0
|
||||||
Reloader.to_prepare { |*args| i += 1 }
|
Reloader.to_prepare { |*args| i += 1 }
|
||||||
|
@ -154,7 +164,8 @@ class ReloaderTest < ActiveSupport::TestCase
|
||||||
|
|
||||||
private
|
private
|
||||||
def call_and_return_body(&block)
|
def call_and_return_body(&block)
|
||||||
@reloader ||= Reloader.new(block || proc {[200, {}, 'response']})
|
@response ||= 'response'
|
||||||
|
@reloader ||= Reloader.new(block || proc {[200, {}, @response]})
|
||||||
@reloader.call({'rack.input' => StringIO.new('')})[2]
|
@reloader.call({'rack.input' => StringIO.new('')})[2]
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -215,6 +215,8 @@ In the example above, Posts controller will no longer automatically look up for
|
||||||
|
|
||||||
h4. Action Dispatch
|
h4. Action Dispatch
|
||||||
|
|
||||||
|
* Use a BodyProxy instead of including a Module that responds to close. Closes #4441 if Active Record is disabled assets are delivered correctly.
|
||||||
|
|
||||||
* Added <tt>ActionDispatch::RequestId</tt> middleware that'll make a unique X-Request-Id header available to the response and enables the <tt>ActionDispatch::Request#uuid</tt> method. This makes it easy to trace requests from end-to-end in the stack and to identify individual requests in mixed logs like Syslog.
|
* Added <tt>ActionDispatch::RequestId</tt> middleware that'll make a unique X-Request-Id header available to the response and enables the <tt>ActionDispatch::Request#uuid</tt> method. This makes it easy to trace requests from end-to-end in the stack and to identify individual requests in mixed logs like Syslog.
|
||||||
|
|
||||||
* The <tt>ShowExceptions</tt> middleware now accepts a exceptions application that is responsible to render an exception when the application fails. The application is invoked with a copy of the exception in +env["action_dispatch.exception"]+ and with the <tt>PATH_INFO</tt> rewritten to the status code.
|
* The <tt>ShowExceptions</tt> middleware now accepts a exceptions application that is responsible to render an exception when the application fails. The application is invoked with a copy of the exception in +env["action_dispatch.exception"]+ and with the <tt>PATH_INFO</tt> rewritten to the status code.
|
||||||
|
|
Loading…
Reference in a new issue