mirror of
https://github.com/ruby/ruby.git
synced 2025-08-26 06:25:31 +02:00
Fix failure on mswin CI
20200619
T054159Z.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.
This commit is contained in:
parent
daa9dcd57e
commit
6fe1919486
2 changed files with 16 additions and 2 deletions
|
@ -324,8 +324,17 @@ module WEBrick
|
||||||
end
|
end
|
||||||
|
|
||||||
def set_filename(req, res)
|
def set_filename(req, res)
|
||||||
res.filename = @root.b
|
res.filename = @root
|
||||||
path_info = req.path_info.scan(%r|/[^/]*|)
|
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
|
path_info.unshift("") # dummy for checking @root dir
|
||||||
while base = path_info.first
|
while base = path_info.first
|
||||||
|
|
|
@ -294,7 +294,12 @@ class WEBrick::TestFileHandler < Test::Unit::TestCase
|
||||||
config = { :DocumentRoot => dir }
|
config = { :DocumentRoot => dir }
|
||||||
TestWEBrick.start_httpserver(config) do |server, addr, port, log|
|
TestWEBrick.start_httpserver(config) do |server, addr, port, log|
|
||||||
http = Net::HTTP.new(addr, port)
|
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')}") }
|
http.request(req){|res| assert_equal("200", res.code, log.call + "\nFilesystem encoding is #{Encoding.find('filesystem')}") }
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue