Skip to content

Commit

Permalink
Fix serving index files with rack static file server [#2180 state:res…
Browse files Browse the repository at this point in the history
…olved]
  • Loading branch information
josh committed Mar 10, 2009
1 parent 224a534 commit 0c9bbf8
Show file tree
Hide file tree
Showing 5 changed files with 54 additions and 4 deletions.
17 changes: 13 additions & 4 deletions railties/lib/rails/rack/static.rb
Expand Up @@ -13,14 +13,18 @@ def initialize(app)
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)
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

Expand All @@ -32,6 +36,11 @@ 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
end
1 change: 1 addition & 0 deletions railties/test/public/foo/bar.html
@@ -0,0 +1 @@
/foo/bar.html
1 change: 1 addition & 0 deletions railties/test/public/foo/index.html
@@ -0,0 +1 @@
/foo/index.html
1 change: 1 addition & 0 deletions railties/test/public/index.html
@@ -0,0 +1 @@
/index.html
38 changes: 38 additions & 0 deletions railties/test/rack_static_test.rb
@@ -0,0 +1,38 @@
require 'abstract_unit'

require 'action_controller'
require 'rails/rack'

class RackStaticTest < ActiveSupport::TestCase
DummyApp = lambda { |env|
[200, {"Content-Type" => "text/plain"}, ["Hello, World!"]]
}
App = Rails::Rack::Static.new(DummyApp)

test "serves dynamic content" do
assert_equal "Hello, World!", get("/nofile")
end

test "serves static index at root" do
assert_equal "/index.html", get("/index.html")
assert_equal "/index.html", get("/index")
assert_equal "/index.html", get("/")
end

test "serves static file in directory" do
assert_equal "/foo/bar.html", get("/foo/bar.html")
assert_equal "/foo/bar.html", get("/foo/bar/")
assert_equal "/foo/bar.html", get("/foo/bar")
end

test "serves static index file in directory" do
assert_equal "/foo/index.html", get("/foo/index.html")
assert_equal "/foo/index.html", get("/foo/")
assert_equal "/foo/index.html", get("/foo")
end

private
def get(path)
Rack::MockRequest.new(App).request("GET", path).body
end
end

0 comments on commit 0c9bbf8

Please sign in to comment.