diff options
author | Kazuhiro NISHIYAMA <zn@mbf.nifty.com> | 2020-06-19 20:06:26 +0900 |
---|---|---|
committer | Kazuhiro NISHIYAMA <zn@mbf.nifty.com> | 2020-06-19 20:13:22 +0900 |
commit | 6fe1919486111bcdd5ef41fea15b0e82f7f50d82 (patch) | |
tree | a4ff099ab6eec915a493fc92867b1a4c241edd59 | |
parent | daa9dcd57ecb84e108d2390a361790f29ed415e7 (diff) | |
download | ruby-6fe1919486111bcdd5ef41fea15b0e82f7f50d82.tar.gz |
Fix failure on mswin CI
https://rubyci.org/logs/mswinci.japaneast.cloudapp.azure.com/vc12-x64/ruby-master/log/20200619T054159Z.fail.html.gz
```
1) Failure:
WEBrick::TestFileHandler#test_cjk_in_path [D:/tmp/mswin-build20200619-14304-utgij/ruby/test/webrick/utils.rb:72]:
exceptions on 2 threads:
webrick log start:
[2020-06-19 16:28:42] ERROR `/あ.txt' not found.
webrick log end
Filesystem encoding is Windows-31J.
<"200"> expected but was
<"404">.
---
<[]> expected but was
<["[2020-06-19 16:28:42] ERROR `/\xE3\x81\x82.txt' not found.\n"]>.
```
`prevent_directory_traversal` treats `path_info` as filesystem encoding.
So path_info should be filesystem encoding in request URL.
On some environments, fallback to ASCII-8BIT when EncodingError.
-rw-r--r-- | lib/webrick/httpservlet/filehandler.rb | 11 | ||||
-rw-r--r-- | test/webrick/test_filehandler.rb | 7 |
2 files changed, 16 insertions, 2 deletions
diff --git a/lib/webrick/httpservlet/filehandler.rb b/lib/webrick/httpservlet/filehandler.rb index 06d1a3067d..f41a5b07cf 100644 --- a/lib/webrick/httpservlet/filehandler.rb +++ b/lib/webrick/httpservlet/filehandler.rb @@ -324,8 +324,17 @@ module WEBrick end def set_filename(req, res) - res.filename = @root.b + res.filename = @root path_info = req.path_info.scan(%r|/[^/]*|) + begin + path_info.map! do |path| + path.force_encoding('filesystem').encode(@root.encoding) + end + rescue EncodingError + path_info.map! do |path| + path.force_encoding(@root.encoding) + end + end path_info.unshift("") # dummy for checking @root dir while base = path_info.first diff --git a/test/webrick/test_filehandler.rb b/test/webrick/test_filehandler.rb index edf0d8b12c..758ec7f589 100644 --- a/test/webrick/test_filehandler.rb +++ b/test/webrick/test_filehandler.rb @@ -294,7 +294,12 @@ class WEBrick::TestFileHandler < Test::Unit::TestCase config = { :DocumentRoot => dir } TestWEBrick.start_httpserver(config) do |server, addr, port, log| http = Net::HTTP.new(addr, port) - req = Net::HTTP::Get.new("/%E3%81%82.txt") + begin + path = "/\u3042.txt".encode('filesystem') + rescue EncodingError + path = "/\u3042.txt".force_encoding(Encoding::ASCII_8BIT) + end + req = Net::HTTP::Get.new(WEBrick::HTTPUtils::escape(path)) http.request(req){|res| assert_equal("200", res.code, log.call + "\nFilesystem encoding is #{Encoding.find('filesystem')}") } end end |