diff --git a/lib/sprockets/server.rb b/lib/sprockets/server.rb index e9c2e5925..75b6c8c67 100644 --- a/lib/sprockets/server.rb +++ b/lib/sprockets/server.rb @@ -25,11 +25,6 @@ def call(env) msg = "Served asset #{env['PATH_INFO']} -" - # Mark session as "skipped" so no `Set-Cookie` header is set - env['rack.session.options'] ||= {} - env['rack.session.options'][:defer] = true - env['rack.session.options'][:skip] = true - # Extract the path from everything after the leading slash path = unescape(env['PATH_INFO'].to_s.sub(/^\//, '')) @@ -45,6 +40,8 @@ def call(env) # Look up the asset. asset = find_asset(path, :bundle => !body_only?(env)) + # Do not change session options when pass the request to other routes. + skip_session(env) unless asset.nil? # `find_asset` returns nil if the asset doesn't exist if asset.nil? @@ -243,5 +240,12 @@ def unescape(str) def etag(asset) %("#{asset.digest}") end + + # Mark session as "skipped" so no `Set-Cookie` header is set + def skip_session(env) + env['rack.session.options'] ||= {} + env['rack.session.options'][:defer] = true + env['rack.session.options'][:skip] = true + end end end diff --git a/test/test_server.rb b/test/test_server.rb index 41e263d7c..ce3e42a98 100644 --- a/test/test_server.rb +++ b/test/test_server.rb @@ -76,6 +76,13 @@ def app last_response.headers['ETag'] end + test "serve source with session skipped" do + rack_env = { 'PATH_INFO' => "application.js" } + @env.call(rack_env) + assert_equal true, rack_env['rack.session.options'][:skip] + assert_equal true, rack_env['rack.session.options'][:defer] + end + test "updated file updates the last modified header" do time = Time.now path = fixture_path "server/app/javascripts/foo.js" @@ -165,6 +172,12 @@ def app assert_equal "pass", last_response.headers['X-Cascade'] end + test "missing source does not touch env" do + rack_env = { 'PATH_INFO' => "none.js" } + @env.call(rack_env) + assert_equal nil, rack_env['rack.session.options'] + end + test "re-throw JS exceptions in the browser" do get "/assets/missing_require.js" assert_equal 200, last_response.status