From 3238641750c1f6d9e6be5d74fadc53e512638fe2 Mon Sep 17 00:00:00 2001 From: Kazuhiro NISHIYAMA Date: Mon, 22 Jun 2020 17:37:37 +0900 Subject: Use filesystem encoding for file path only `path_info` contains filesystem encoding and binary. Example is `"/webrick.cgi/%A5%DB%A4%B2/%A4%DB%A4%B2"` in `TestWEBrickCGI#test_cgi`. --- lib/webrick/httpservlet/filehandler.rb | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) (limited to 'lib') diff --git a/lib/webrick/httpservlet/filehandler.rb b/lib/webrick/httpservlet/filehandler.rb index 41c0618934..010df0e918 100644 --- a/lib/webrick/httpservlet/filehandler.rb +++ b/lib/webrick/httpservlet/filehandler.rb @@ -213,10 +213,11 @@ module WEBrick # :stopdoc: def set_filesystem_encoding(str) - if Encoding.find('filesystem') == Encoding::US_ASCII + enc = Encoding.find('filesystem') + if enc == Encoding::US_ASCII str.b else - str.dup.force_encoding('filesystem') + str.dup.force_encoding(enc) end end @@ -333,10 +334,11 @@ module WEBrick def set_filename(req, res) res.filename = @root - path_info = req.path_info.scan(%r|/[^/]*|).map{|path| set_filesystem_encoding(path) } + path_info = req.path_info.scan(%r|/[^/]*|) path_info.unshift("") # dummy for checking @root dir while base = path_info.first + base = set_filesystem_encoding(base) break if base == "/" break unless File.directory?(File.expand_path(res.filename + base)) shift_path_info(req, res, path_info) @@ -344,6 +346,7 @@ module WEBrick end if base = path_info.first + base = set_filesystem_encoding(base) if base == "/" if file = search_index_file(req, res) shift_path_info(req, res, path_info, file) @@ -372,7 +375,7 @@ module WEBrick def shift_path_info(req, res, path_info, base=nil) tmp = path_info.shift - base = base || tmp + base = base || set_filesystem_encoding(tmp) req.path_info = path_info.join req.script_name << base res.filename = File.expand_path(res.filename + base) -- cgit v1.2.3