summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorKazuhiro NISHIYAMA <zn@mbf.nifty.com>2020-06-19 22:47:08 +0900
committerKazuhiro NISHIYAMA <zn@mbf.nifty.com>2020-06-19 22:56:29 +0900
commit97c1782db634ab0344fbc829477897d5de034475 (patch)
tree0a78db9a4b7480422945cdfcaceec342cfc7b5c1 /lib
parent78d4eace02c3c03b65d775a3bb7537f2a6e8c6e7 (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.rb19
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