diff options
author | Joshua Peek <josh@joshpeek.com> | 2008-06-01 13:18:31 -0700 |
---|---|---|
committer | Joshua Peek <josh@joshpeek.com> | 2008-06-01 13:18:31 -0700 |
commit | a980eb8c7734f14109d8c2a02a88dafdf682e0dc (patch) | |
tree | e948b90b850213a83df78eb2e311efc8bf466c15 /railties | |
parent | 06cb20708be13fbf736447aa0e5e6dd7d64c8b5d (diff) | |
download | rails-a980eb8c7734f14109d8c2a02a88dafdf682e0dc.tar.gz rails-a980eb8c7734f14109d8c2a02a88dafdf682e0dc.tar.bz2 rails-a980eb8c7734f14109d8c2a02a88dafdf682e0dc.zip |
Added Rack middleware to handle static files.
Diffstat (limited to 'railties')
-rw-r--r-- | railties/lib/initializer.rb | 1 | ||||
-rw-r--r-- | railties/lib/rails/rack.rb | 5 | ||||
-rw-r--r-- | railties/lib/rails/rack/static.rb | 35 |
3 files changed, 41 insertions, 0 deletions
diff --git a/railties/lib/initializer.rb b/railties/lib/initializer.rb index ca63fa734b..bdadfeea8f 100644 --- a/railties/lib/initializer.rb +++ b/railties/lib/initializer.rb @@ -8,6 +8,7 @@ require 'rails/version' require 'rails/plugin/locator' require 'rails/plugin/loader' require 'rails/gem_dependency' +require 'rails/rack' RAILS_ENV = (ENV['RAILS_ENV'] || 'development').dup unless defined?(RAILS_ENV) diff --git a/railties/lib/rails/rack.rb b/railties/lib/rails/rack.rb new file mode 100644 index 0000000000..abcd0741bf --- /dev/null +++ b/railties/lib/rails/rack.rb @@ -0,0 +1,5 @@ +module Rails + module Rack + autoload :Static, "rails/rack/static" + end +end diff --git a/railties/lib/rails/rack/static.rb b/railties/lib/rails/rack/static.rb new file mode 100644 index 0000000000..45eb0e5921 --- /dev/null +++ b/railties/lib/rails/rack/static.rb @@ -0,0 +1,35 @@ +module Rails + module Rack + class Static + FILE_METHODS = %w(GET HEAD).freeze + + def initialize(app) + @app = app + @file_server = ::Rack::File.new(File.join(RAILS_ROOT, "public")) + end + + def call(env) + path = env['PATH_INFO'].chomp('/') + method = env['REQUEST_METHOD'] + cached_path = (path.empty? ? 'index' : path) + ::ActionController::Base.page_cache_extension + + if FILE_METHODS.include?(method) + if file_exist?(path) + return @file_server.call(env) + elsif file_exist?(cached_path) + env['PATH_INFO'] = cached_path + return @file_server.call(env) + end + end + + @app.call(env) + end + + private + def file_exist?(path) + full_path = File.join(@file_server.root, ::Rack::Utils.unescape(path)) + File.file?(full_path) && File.readable?(full_path) + end + end + end +end |