diff --git a/actionpack/lib/action_dispatch/middleware/static.rb b/actionpack/lib/action_dispatch/middleware/static.rb index 073313227786b..e66c21ef8557f 100644 --- a/actionpack/lib/action_dispatch/middleware/static.rb +++ b/actionpack/lib/action_dispatch/middleware/static.rb @@ -21,17 +21,13 @@ def initialize(root, cache_control) end def match?(path) - path = unescape_path(path) + path = URI.parser.unescape(path) return false unless path.valid_encoding? - full_path = path.empty? ? @root : File.join(@root, escape_glob_chars(path)) - paths = "#{full_path}#{ext}" + paths = [path, "#{path}#{ext}", "#{path}/index#{ext}"] - matches = Dir[paths] - match = matches.detect { |m| File.file?(m) } - if match - match.sub!(@compiled_root, '') - ::Rack::Utils.escape(match) + if match = paths.detect {|p| File.file?(File.join(@root, p)) } + return ::Rack::Utils.escape(match) end end @@ -57,18 +53,7 @@ def call(env) private def ext - @ext ||= begin - ext = ::ActionController::Base.default_static_extension - "{,#{ext},/index#{ext}}" - end - end - - def unescape_path(path) - URI.parser.unescape(path) - end - - def escape_glob_chars(path) - path.gsub(/[*?{}\[\]]/, "\\\\\\&") + ::ActionController::Base.default_static_extension end def content_type(path) diff --git a/actionpack/test/dispatch/static_test.rb b/actionpack/test/dispatch/static_test.rb index 97affc7b21c48..6f7373201caf4 100644 --- a/actionpack/test/dispatch/static_test.rb +++ b/actionpack/test/dispatch/static_test.rb @@ -37,6 +37,10 @@ def test_serves_static_index_file_in_directory assert_html "/foo/index.html", get("/foo") end + def test_serves_file_with_same_name_before_index_in_directory + assert_html "/bar.html", get("/bar") + end + def test_served_static_file_with_non_english_filename jruby_skip "Stop skipping if following bug gets fixed: " \ "http://jira.codehaus.org/browse/JRUBY-7192" diff --git a/actionpack/test/fixtures/public/bar.html b/actionpack/test/fixtures/public/bar.html new file mode 100644 index 0000000000000..67fc57079b71f --- /dev/null +++ b/actionpack/test/fixtures/public/bar.html @@ -0,0 +1 @@ +/bar.html \ No newline at end of file diff --git a/actionpack/test/fixtures/public/bar/index.html b/actionpack/test/fixtures/public/bar/index.html new file mode 100644 index 0000000000000..d5bb8f898d462 --- /dev/null +++ b/actionpack/test/fixtures/public/bar/index.html @@ -0,0 +1 @@ +/bar/index.html \ No newline at end of file diff --git "a/actionpack/test/fixtures/\345\205\254\345\205\261/bar.html" "b/actionpack/test/fixtures/\345\205\254\345\205\261/bar.html" new file mode 100644 index 0000000000000..67fc57079b71f --- /dev/null +++ "b/actionpack/test/fixtures/\345\205\254\345\205\261/bar.html" @@ -0,0 +1 @@ +/bar.html \ No newline at end of file diff --git "a/actionpack/test/fixtures/\345\205\254\345\205\261/bar/index.html" "b/actionpack/test/fixtures/\345\205\254\345\205\261/bar/index.html" new file mode 100644 index 0000000000000..d5bb8f898d462 --- /dev/null +++ "b/actionpack/test/fixtures/\345\205\254\345\205\261/bar/index.html" @@ -0,0 +1 @@ +/bar/index.html \ No newline at end of file