diff options
-rwxr-xr-x | actionpack/lib/action_controller/base.rb | 4 | ||||
-rw-r--r-- | actionpack/test/controller/render_test.rb | 7 |
2 files changed, 9 insertions, 2 deletions
diff --git a/actionpack/lib/action_controller/base.rb b/actionpack/lib/action_controller/base.rb index 524d11de50..ecbe15bada 100755 --- a/actionpack/lib/action_controller/base.rb +++ b/actionpack/lib/action_controller/base.rb @@ -653,7 +653,7 @@ module ActionController #:nodoc: # # Rendering will automatically insert the etag header on 200 OK responses. The etag is calculated using MD5 of the # response body. If a request comes in that has a matching etag, the response will be changed to a 304 Not Modified - # and the response body will be set to an empty string. + # and the response body will be set to an empty string. No etag header will be inserted if it's already set. # # === Rendering a template # @@ -879,7 +879,7 @@ module ActionController #:nodoc: if text.is_a?(String) if response.headers['Status'][0..2] == '200' && !response.body.empty? - response.headers['Etag'] = %("#{Digest::MD5.hexdigest(text)}") + response.headers['Etag'] ||= %("#{Digest::MD5.hexdigest(text)}") if request.headers['HTTP_IF_NONE_MATCH'] == response.headers['Etag'] response.headers['Status'] = "304 Not Modified" diff --git a/actionpack/test/controller/render_test.rb b/actionpack/test/controller/render_test.rb index dd5255ce35..fb784d3e02 100644 --- a/actionpack/test/controller/render_test.rb +++ b/actionpack/test/controller/render_test.rb @@ -328,6 +328,13 @@ class RenderTest < Test::Unit::TestCase assert_nil @response.headers['Etag'] end + def test_etag_should_not_be_changed_when_already_set + expected_etag = etag_for("hello somewhere else") + @response.headers["Etag"] = expected_etag + get :render_hello_world_from_variable + assert_equal expected_etag, @response.headers['Etag'] + end + protected def assert_deprecated_render(&block) assert_deprecated(/render/, &block) |