diff options
author | Joshua Peek <josh@joshpeek.com> | 2009-09-26 11:37:42 -0500 |
---|---|---|
committer | Joshua Peek <josh@joshpeek.com> | 2009-09-26 11:37:42 -0500 |
commit | ef58194129a1dc0a96286c271b71455d37712b42 (patch) | |
tree | 8a40025c2bd3d773e80afbeea6478b6102fc8a57 /actionpack/lib/action_dispatch/middleware | |
parent | dbb32115ef45dd58667e450125deba80d7016341 (diff) | |
download | rails-ef58194129a1dc0a96286c271b71455d37712b42.tar.gz rails-ef58194129a1dc0a96286c271b71455d37712b42.tar.bz2 rails-ef58194129a1dc0a96286c271b71455d37712b42.zip |
Move Rails::Static into ActionDispatch
Diffstat (limited to 'actionpack/lib/action_dispatch/middleware')
-rw-r--r-- | actionpack/lib/action_dispatch/middleware/static.rb | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/actionpack/lib/action_dispatch/middleware/static.rb b/actionpack/lib/action_dispatch/middleware/static.rb new file mode 100644 index 0000000000..d7e88a54e4 --- /dev/null +++ b/actionpack/lib/action_dispatch/middleware/static.rb @@ -0,0 +1,44 @@ +require 'rack/utils' + +module ActionDispatch + class Static + FILE_METHODS = %w(GET HEAD).freeze + + def initialize(app, root) + @app = app + @file_server = ::Rack::File.new(root) + end + + def call(env) + path = env['PATH_INFO'].chomp('/') + method = env['REQUEST_METHOD'] + + if FILE_METHODS.include?(method) + if file_exist?(path) + return @file_server.call(env) + else + cached_path = directory_exist?(path) ? "#{path}/index" : path + cached_path += ::ActionController::Base.page_cache_extension + + if file_exist?(cached_path) + env['PATH_INFO'] = cached_path + return @file_server.call(env) + end + 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 + + def directory_exist?(path) + full_path = File.join(@file_server.root, ::Rack::Utils.unescape(path)) + File.directory?(full_path) && File.readable?(full_path) + end + end +end |