Permalink
Browse files

Temporarily ship with ContentLength middleware.

  • Loading branch information...
josevalim committed May 20, 2011
1 parent 19ee841 commit 5eadb4d73dc5384509efeea3b9584ded19956c7b
View
@@ -11,7 +11,6 @@ end
gem "coffee-script"
gem "sass"
gem "uglifier", :git => "git://github.com/lautis/uglifier.git"
-gem "rack", :git => "git://github.com/rack/rack.git"
gem "rake", ">= 0.8.7"
gem "mocha", ">= 0.9.8"
@@ -22,7 +22,7 @@ Gem::Specification.new do |s|
s.add_dependency('rack-cache', '~> 1.0.1')
s.add_dependency('builder', '~> 3.0.0')
s.add_dependency('i18n', '~> 0.6.0beta1')
- s.add_dependency('rack', '~> 1.3.0.beta')
+ s.add_dependency('rack', '~> 1.3.0.beta2')
s.add_dependency('rack-test', '~> 0.6.0')
s.add_dependency('rack-mount', '~> 0.8.1')
s.add_dependency('sprockets', '~> 2.0.0.beta.5')
@@ -141,7 +141,7 @@ def config
def default_middleware_stack
ActionDispatch::MiddlewareStack.new.tap do |middleware|
- middleware.use ::Rack::ContentLength, config.action_dispatch.x_sendfile_header
+ middleware.use ::Rails::Rack::ContentLength, config.action_dispatch.x_sendfile_header
if rack_cache = config.action_controller.perform_caching && config.action_dispatch.rack_cache
require "action_dispatch/http/rack_cache"
@@ -1,8 +1,8 @@
module Rails
module Rack
- autoload :Debugger, "rails/rack/debugger"
- autoload :Logger, "rails/rack/logger"
- autoload :LogTailer, "rails/rack/log_tailer"
- autoload :Static, "rails/rack/static"

This comment has been minimized.

Show comment Hide comment
@spastorino

spastorino May 20, 2011

Member

@josevalim come on bro :P ^^^.

@spastorino

spastorino May 20, 2011

Member

@josevalim come on bro :P ^^^.

+ autoload :ContentLength, "rails/rack/content_length"
+ autoload :Debugger, "rails/rack/debugger"
+ autoload :Logger, "rails/rack/logger"
+ autoload :LogTailer, "rails/rack/log_tailer"
end
end
@@ -0,0 +1,38 @@
+require 'action_dispatch'
+require 'rack/utils'
+
+module Rails
+ module Rack
+ # Sets the Content-Length header on responses with fixed-length bodies.
+ class ContentLength
+ include ::Rack::Utils
+
+ def initialize(app, sendfile=nil)
+ @app = app
+ @sendfile = sendfile
+ end
+
+ def call(env)
+ status, headers, body = @app.call(env)
+ headers = HeaderHash.new(headers)
+
+ if !STATUS_WITH_NO_ENTITY_BODY.include?(status.to_i) &&
+ !headers['Content-Length'] &&
+ !headers['Transfer-Encoding'] &&
+ !(@sendfile && headers[@sendfile])
+
+ old_body = body
+ body, length = [], 0
+ old_body.each do |part|
+ body << part
+ length += bytesize(part)
+ end
+ old_body.close if old_body.respond_to?(:close)
+ headers['Content-Length'] = length.to_s
+ end
+
+ [status, headers, body]
+ end
+ end
+ end
+end
@@ -1,5 +0,0 @@
-require 'action_dispatch'
-
-module Rails::Rack
- Static = ActiveSupport::Deprecation::DeprecatedConstantProxy.new('Rails::Rack::Static', ActionDispatch::Static)
-end
@@ -19,7 +19,7 @@ def app
boot!
assert_equal [
- "Rack::ContentLength",
+ "Rails::Rack::ContentLength",
"ActionDispatch::Static",
"Rack::Lock",
"ActiveSupport::Cache::Strategy::LocalCache",
@@ -104,7 +104,7 @@ def app
end
test "insert middleware after" do
- add_to_config "config.middleware.insert_after Rack::ContentLength, Rack::Config"
+ add_to_config "config.middleware.insert_after Rails::Rack::ContentLength, Rack::Config"
boot!
assert_equal "Rack::Config", middleware.second
end
@@ -127,7 +127,7 @@ def app
end
test "insert middleware before" do
- add_to_config "config.middleware.insert_before Rack::ContentLength, Rack::Config"
+ add_to_config "config.middleware.insert_before Rails::Rack::ContentLength, Rack::Config"
boot!
assert_equal "Rack::Config", middleware.first
end

3 comments on commit 5eadb4d

@raggi

This comment has been minimized.

Show comment Hide comment
@raggi

raggi May 20, 2011

Contributor

José - can you explain what the intent is here? I want to fix this rack side, but I can't see exactly what it is you're trying to battle. I'm thinking at the moment of extracting some of the sendfile generics from Rack::Sendfile into Rack::Utils so I can try sendfile?(env, body), but it seems like a middleware out of order problem.

Contributor

raggi replied May 20, 2011

José - can you explain what the intent is here? I want to fix this rack side, but I can't see exactly what it is you're trying to battle. I'm thinking at the moment of extracting some of the sendfile generics from Rack::Sendfile into Rack::Utils so I can try sendfile?(env, body), but it seems like a middleware out of order problem.

@josevalim

This comment has been minimized.

Show comment Hide comment
@josevalim

josevalim May 21, 2011

Contributor
Contributor

josevalim replied May 21, 2011

@raggi

This comment has been minimized.

Show comment Hide comment
@raggi

raggi Oct 6, 2011

Contributor
    headers['Content-Length'] = File.size(file); headers['X-Sendfile'] = file
Contributor

raggi replied Oct 6, 2011

    headers['Content-Length'] = File.size(file); headers['X-Sendfile'] = file
Please sign in to comment.