diff options
author | Kazuhiro NISHIYAMA <[email protected]> | 2020-06-19 22:47:08 +0900 |
---|---|---|
committer | Kazuhiro NISHIYAMA <[email protected]> | 2020-06-19 22:56:29 +0900 |
commit | 97c1782db634ab0344fbc829477897d5de034475 (patch) | |
tree | 0a78db9a4b7480422945cdfcaceec342cfc7b5c1 /lib | |
parent | 78d4eace02c3c03b65d775a3bb7537f2a6e8c6e7 (diff) |
Use filesystem encoding as FileHandler's encoding
instead of `@root.encoding`.
And fallback to ASCII-8BIT when filesystem encoding is US-ASCII.
When `@root.encoding` is not compatible filesystem encoding,
`Encoding::CompatibilityError` raised at `webrick/httpservlet/filehandler.rb:341`.
So `DocumentRoot` must be compatible with filesystem encoding.
Diffstat (limited to 'lib')
-rw-r--r-- | lib/webrick/httpservlet/filehandler.rb | 19 |
1 files changed, 9 insertions, 10 deletions
diff --git a/lib/webrick/httpservlet/filehandler.rb b/lib/webrick/httpservlet/filehandler.rb index f67d416b72..4f6fe706e2 100644 --- a/lib/webrick/httpservlet/filehandler.rb +++ b/lib/webrick/httpservlet/filehandler.rb @@ -212,6 +212,14 @@ module WEBrick # :stopdoc: + def set_filesystem_encoding(str) + if Encoding.find('filesystem') == Encoding::US_ASCII + str.b + else + str.dup.force_encoding('filesystem') + end + end + def service(req, res) # if this class is mounted on "/" and /~username is requested. # we're going to override path information before invoking service. @@ -325,16 +333,7 @@ module WEBrick def set_filename(req, res) 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 = set_filesystem_encoding(req.path_info).scan(%r|/[^/]*|) path_info.unshift("") # dummy for checking @root dir while base = path_info.first |