diff options
author | deepj <deepjungle.maca@gmail.com> | 2015-05-25 01:52:10 +0200 |
---|---|---|
committer | deepj <deepjungle.maca@gmail.com> | 2015-05-26 23:37:54 +0200 |
commit | 8a7a142de07cc052f5046bfb17b903d467eb24f6 (patch) | |
tree | 3f78c5caf5128c90213c357401c202c04ec490c9 | |
parent | 7b5820f8de7f9dffeb03d86588bba13fb0e91df1 (diff) | |
download | rack-8a7a142de07cc052f5046bfb17b903d467eb24f6.tar.gz |
Encoding class can be used freely everywhere
-rw-r--r-- | lib/rack/chunked.rb | 2 | ||||
-rw-r--r-- | lib/rack/handler/mongrel.rb | 2 | ||||
-rw-r--r-- | lib/rack/handler/scgi.rb | 3 | ||||
-rw-r--r-- | lib/rack/handler/webrick.rb | 2 | ||||
-rw-r--r-- | lib/rack/mock.rb | 5 | ||||
-rw-r--r-- | lib/rack/multipart/generator.rb | 6 | ||||
-rw-r--r-- | lib/rack/multipart/parser.rb | 76 | ||||
-rw-r--r-- | lib/rack/multipart/uploaded_file.rb | 3 | ||||
-rw-r--r-- | lib/rack/utils.rb | 19 |
9 files changed, 45 insertions, 73 deletions
diff --git a/lib/rack/chunked.rb b/lib/rack/chunked.rb index bd8faf3c..4b8f270e 100644 --- a/lib/rack/chunked.rb +++ b/lib/rack/chunked.rb @@ -24,7 +24,7 @@ module Rack size = chunk.bytesize next if size == 0 - chunk = chunk.dup.force_encoding(Encoding::BINARY) if chunk.respond_to?(:force_encoding) + chunk = chunk.dup.force_encoding(Encoding::BINARY) yield [size.to_s(16), term, chunk, term].join end yield TAIL diff --git a/lib/rack/handler/mongrel.rb b/lib/rack/handler/mongrel.rb index af0e7cd1..bd42309d 100644 --- a/lib/rack/handler/mongrel.rb +++ b/lib/rack/handler/mongrel.rb @@ -66,7 +66,7 @@ module Rack env[SCRIPT_NAME] = "" if env[SCRIPT_NAME] == "/" rack_input = request.body || StringIO.new('') - rack_input.set_encoding(Encoding::BINARY) if rack_input.respond_to?(:set_encoding) + rack_input.set_encoding(Encoding::BINARY) env.update({"rack.version" => Rack::VERSION, "rack.input" => rack_input, diff --git a/lib/rack/handler/scgi.rb b/lib/rack/handler/scgi.rb index 8d3eea26..2e54e050 100644 --- a/lib/rack/handler/scgi.rb +++ b/lib/rack/handler/scgi.rb @@ -41,8 +41,7 @@ module Rack env[QUERY_STRING] ||= "" env[SCRIPT_NAME] = "" - rack_input = StringIO.new(input_body) - rack_input.set_encoding(Encoding::BINARY) if rack_input.respond_to?(:set_encoding) + rack_input = StringIO.new(input_body, encoding: Encoding::BINARY) env.update({"rack.version" => Rack::VERSION, "rack.input" => rack_input, diff --git a/lib/rack/handler/webrick.rb b/lib/rack/handler/webrick.rb index 992f813a..76e07f59 100644 --- a/lib/rack/handler/webrick.rb +++ b/lib/rack/handler/webrick.rb @@ -60,7 +60,7 @@ module Rack env.delete_if { |k, v| v.nil? } rack_input = StringIO.new(req.body.to_s) - rack_input.set_encoding(Encoding::BINARY) if rack_input.respond_to?(:set_encoding) + rack_input.set_encoding(Encoding::BINARY) env.update({"rack.version" => Rack::VERSION, "rack.input" => rack_input, diff --git a/lib/rack/mock.rb b/lib/rack/mock.rb index ae50fd41..8d1e0635 100644 --- a/lib/rack/mock.rb +++ b/lib/rack/mock.rb @@ -128,8 +128,7 @@ module Rack end end - empty_str = "" - empty_str.force_encoding("ASCII-8BIT") if empty_str.respond_to? :force_encoding + empty_str = ''.force_encoding(Encoding::ASCII_8BIT) opts[:input] ||= empty_str if String === opts[:input] rack_input = StringIO.new(opts[:input]) @@ -137,7 +136,7 @@ module Rack rack_input = opts[:input] end - rack_input.set_encoding(Encoding::BINARY) if rack_input.respond_to?(:set_encoding) + rack_input.set_encoding(Encoding::BINARY) env['rack.input'] = rack_input env["CONTENT_LENGTH"] ||= env["rack.input"].length.to_s diff --git a/lib/rack/multipart/generator.rb b/lib/rack/multipart/generator.rb index 1c586b75..edf11669 100644 --- a/lib/rack/multipart/generator.rb +++ b/lib/rack/multipart/generator.rb @@ -15,8 +15,8 @@ module Rack flattened_params.map do |name, file| if file.respond_to?(:original_filename) - ::File.open(file.path, "rb") do |f| - f.set_encoding(Encoding::BINARY) if f.respond_to?(:set_encoding) + ::File.open(file.path, 'rb') do |f| + f.set_encoding(Encoding::BINARY) content_for_tempfile(f, file, name) end else @@ -90,4 +90,4 @@ EOF end end end -end
\ No newline at end of file +end diff --git a/lib/rack/multipart/parser.rb b/lib/rack/multipart/parser.rb index 3be3a207..c47c5f37 100644 --- a/lib/rack/multipart/parser.rb +++ b/lib/rack/multipart/parser.rb @@ -27,11 +27,7 @@ module Rack end def initialize(boundary, io, content_length, env, tempfile, bufsize) - @buf = "" - - if @buf.respond_to? :force_encoding - @buf.force_encoding Encoding::ASCII_8BIT - end + @buf = "".force_encoding(Encoding::ASCII_8BIT) @params = Utils::KeySpaceConstrainedParams.new @boundary = "--#{boundary}" @@ -110,11 +106,7 @@ module Rack def get_current_head_and_filename_and_content_type_and_name_and_body head = nil - body = '' - - if body.respond_to? :force_encoding - body.force_encoding Encoding::ASCII_8BIT - end + body = ''.force_encoding(Encoding::ASCII_8BIT) filename = content_type = name = nil @@ -172,7 +164,7 @@ module Rack filename = Utils.unescape(filename) end - scrub_filename filename + scrub_filename(filename) if filename !~ /\\[^\\"]/ filename = filename.gsub(/\\(.)/, '\1') @@ -180,51 +172,45 @@ module Rack filename end - if "<3".respond_to? :valid_encoding? - def scrub_filename(filename) - unless filename.valid_encoding? - # FIXME: this force_encoding is for Ruby 2.0 and 1.9 support. - # We can remove it after they are dropped - filename.force_encoding(Encoding::ASCII_8BIT) - filename.encode!(:invalid => :replace, :undef => :replace) - end + def scrub_filename(filename) + unless filename.valid_encoding? + # FIXME: this force_encoding is for Ruby 2.0 and 1.9 support. + # We can remove it after they are dropped + filename.force_encoding(Encoding::ASCII_8BIT) + filename.encode!(:invalid => :replace, :undef => :replace) end + end - CHARSET = "charset" + CHARSET = "charset" - def tag_multipart_encoding(filename, content_type, name, body) - name = name.to_s - name.force_encoding Encoding::UTF_8 + def tag_multipart_encoding(filename, content_type, name, body) + name = name.to_s + encoding = Encoding::UTF_8 - return if filename + name.force_encoding(encoding) - encoding = Encoding::UTF_8 + return if filename - if content_type - list = content_type.split(';') - type_subtype = list.first - type_subtype.strip! - if TEXT_PLAIN == type_subtype - rest = list.drop 1 - rest.each do |param| - k,v = param.split('=', 2) - k.strip! - v.strip! - encoding = Encoding.find v if k == CHARSET - end + if content_type + list = content_type.split(';') + type_subtype = list.first + type_subtype.strip! + if TEXT_PLAIN == type_subtype + rest = list.drop 1 + rest.each do |param| + k,v = param.split('=', 2) + k.strip! + v.strip! + encoding = Encoding.find v if k == CHARSET end end - - name.force_encoding encoding - body.force_encoding encoding - end - else - def scrub_filename(filename) - end - def tag_multipart_encoding(filename, content_type, name, body) end + + name.force_encoding(encoding) + body.force_encoding(encoding) end + def get_data(filename, body, content_type, name, head) data = body if filename == "" diff --git a/lib/rack/multipart/uploaded_file.rb b/lib/rack/multipart/uploaded_file.rb index 1b56ad75..924b1f08 100644 --- a/lib/rack/multipart/uploaded_file.rb +++ b/lib/rack/multipart/uploaded_file.rb @@ -11,8 +11,7 @@ module Rack raise "#{path} file does not exist" unless ::File.exist?(path) @content_type = content_type @original_filename = ::File.basename(path) - @tempfile = Tempfile.new([@original_filename, ::File.extname(path)]) - @tempfile.set_encoding(Encoding::BINARY) if @tempfile.respond_to?(:set_encoding) + @tempfile = Tempfile.new([@original_filename, ::File.extname(path)], encoding: Encoding::BINARY) @tempfile.binmode if binary FileUtils.copy_file(path, @tempfile.path) end diff --git a/lib/rack/utils.rb b/lib/rack/utils.rb index 2d7626ec..52aecfe0 100644 --- a/lib/rack/utils.rb +++ b/lib/rack/utils.rb @@ -36,14 +36,8 @@ module Rack # Unescapes a URI escaped string with +encoding+. +encoding+ will be the # target encoding of the string returned, and it defaults to UTF-8 - if defined?(::Encoding) - def unescape(s, encoding = Encoding::UTF_8) - URI.decode_www_form_component(s, encoding) - end - else - def unescape(s, encoding = nil) - URI.decode_www_form_component(s, encoding) - end + def unescape(s, encoding = Encoding::UTF_8) + URI.decode_www_form_component(s, encoding) end module_function :unescape @@ -221,13 +215,8 @@ module Rack '"' => """, "/" => "/" } - if //.respond_to?(:encoding) - ESCAPE_HTML_PATTERN = Regexp.union(*ESCAPE_HTML.keys) - else - # On 1.8, there is a kcode = 'u' bug that allows for XSS otherwise - # TODO doesn't apply to jruby, so a better condition above might be preferable? - ESCAPE_HTML_PATTERN = /#{Regexp.union(*ESCAPE_HTML.keys)}/n - end + + ESCAPE_HTML_PATTERN = Regexp.union(*ESCAPE_HTML.keys) # Escape ampersands, brackets and quotes to their HTML/XML entities. def escape_html(string) |