diff options
author | Kazuhiro NISHIYAMA <zn@mbf.nifty.com> | 2020-06-22 17:37:37 +0900 |
---|---|---|
committer | Kazuhiro NISHIYAMA <zn@mbf.nifty.com> | 2020-06-22 17:37:37 +0900 |
commit | 3238641750c1f6d9e6be5d74fadc53e512638fe2 (patch) | |
tree | 4fb77ade7a13b2e70a70c3d094f2b7bc1d8dd3c9 | |
parent | 61743f0c830498cba3c098a3d9e38644b159c563 (diff) | |
download | ruby-3238641750c1f6d9e6be5d74fadc53e512638fe2.tar.gz |
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`.
-rw-r--r-- | lib/webrick/httpservlet/filehandler.rb | 11 |
1 files changed, 7 insertions, 4 deletions
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) |