Permalink
Browse files

Use ASCII-8BIT paths in ActionDispatch::Static

The rack gem returns PATH_INFO as an ASCII-8BIT encoded string but it
was being converted to US-ASCII by the match? method because it was
calling Rack::Utils.escape_path. To prevent incompatibile encoding
warnings use ASCII-8BIT strings for the root path and let Ruby handle
any filename encoding conversion.

Fixes #32294, Closes #32314.
  • Loading branch information...
pixeltrix committed Mar 21, 2018
1 parent 4c9c3ff commit 2ef145883348e92c9e6393ece9b6967e3a5a80c7
@@ -16,7 +16,7 @@ module ActionDispatch
# does not exist, a 404 "File not Found" response will be returned.
class FileHandler
def initialize(root, index: "index", headers: {})
@root = root.chomp("/")
@root = root.chomp("/").b
@file_server = ::Rack::File.new(@root, headers)
@index = index
end
@@ -35,15 +35,15 @@ def match?(path)
paths = [path, "#{path}#{ext}", "#{path}/#{@index}#{ext}"]
if match = paths.detect { |p|
path = File.join(@root, p.dup.force_encoding(Encoding::UTF_8))
path = File.join(@root, p.b)
begin
File.file?(path) && File.readable?(path)
rescue SystemCallError
false
end
}
return ::Rack::Utils.escape_path(match)
return ::Rack::Utils.escape_path(match).b
end
end
@@ -71,7 +71,16 @@ def test_serves_file_with_same_name_before_index_in_directory
end
def test_served_static_file_with_non_english_filename
assert_html "means hello in Japanese\n", get("/foo/#{Rack::Utils.escape("こんにちは.html")}")
assert_html "means hello in Japanese\n", get("/foo/%E3%81%93%E3%82%93%E3%81%AB%E3%81%A1%E3%81%AF.html")
end
def test_served_gzipped_static_file_with_non_english_filename
response = get("/foo/%E3%81%95%E3%82%88%E3%81%86%E3%81%AA%E3%82%89.html", "HTTP_ACCEPT_ENCODING" => "gzip")
assert_gzip "/foo/さようなら.html", response
assert_equal "text/html", response.headers["Content-Type"]
assert_equal "Accept-Encoding", response.headers["Vary"]
assert_equal "gzip", response.headers["Content-Encoding"]
end
def test_serves_static_file_with_exclamation_mark_in_filename
@@ -0,0 +1 @@
means goodbye in Japanese
Binary file not shown.
@@ -0,0 +1 @@
means goodbye in Japanese
Binary file not shown.

0 comments on commit 2ef1458

Please sign in to comment.