summary refs log tree commit
diff options
context:
space:
mode:
authorMichael Fellinger <m.fellinger@gmail.com>2009-06-30 19:53:38 +0900
committerMichael Fellinger <m.fellinger@gmail.com>2009-06-30 19:53:38 +0900
commit4e53cc767057fd7d425f99e26b9f5131804096ef (patch)
tree0419018b25cded5ae8bc013415337e8b84d126dc
parent889d4d6c3186e2fffeea112a43f37766c6ccec19 (diff)
downloadrack-4e53cc767057fd7d425f99e26b9f5131804096ef.tar.gz
Set correct external_encoding for handlers that don't use RewindableInput
-rw-r--r--lib/rack/handler/lsws.rb21
-rw-r--r--lib/rack/handler/mongrel.rb3
-rw-r--r--lib/rack/handler/scgi.rb7
-rw-r--r--lib/rack/handler/webrick.rb5
-rw-r--r--lib/rack/mock.rb7
5 files changed, 30 insertions, 13 deletions
diff --git a/lib/rack/handler/lsws.rb b/lib/rack/handler/lsws.rb
index 7231336d..b4ddf4bb 100644
--- a/lib/rack/handler/lsws.rb
+++ b/lib/rack/handler/lsws.rb
@@ -15,14 +15,19 @@ module Rack
         env = ENV.to_hash
         env.delete "HTTP_CONTENT_LENGTH"
         env["SCRIPT_NAME"] = "" if env["SCRIPT_NAME"] == "/"
-        env.update({"rack.version" => [1,0],
-                     "rack.input" => StringIO.new($stdin.read.to_s),
-                     "rack.errors" => $stderr,
-                     "rack.multithread" => false,
-                     "rack.multiprocess" => true,
-                     "rack.run_once" => false,
-                     "rack.url_scheme" => ["yes", "on", "1"].include?(ENV["HTTPS"]) ? "https" : "http"
-                   })
+
+        rack_input = RewindableInput.new($stdin.read.to_s)
+
+        env.update(
+          "rack.version" => [1,0],
+          "rack.input" => rack_input,
+          "rack.errors" => $stderr,
+          "rack.multithread" => false,
+          "rack.multiprocess" => true,
+          "rack.run_once" => false,
+          "rack.url_scheme" => ["yes", "on", "1"].include?(ENV["HTTPS"]) ? "https" : "http"
+        )
+
         env["QUERY_STRING"] ||= ""
         env["HTTP_VERSION"] ||= env["SERVER_PROTOCOL"]
         env["REQUEST_PATH"] ||= "/"
diff --git a/lib/rack/handler/mongrel.rb b/lib/rack/handler/mongrel.rb
index 3a5ef32d..f358d920 100644
--- a/lib/rack/handler/mongrel.rb
+++ b/lib/rack/handler/mongrel.rb
@@ -45,6 +45,9 @@ 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)
+
         env.update({"rack.version" => [1,0],
                      "rack.input" => request.body || StringIO.new(""),
                      "rack.errors" => $stderr,
diff --git a/lib/rack/handler/scgi.rb b/lib/rack/handler/scgi.rb
index 6c4932df..bd860a5d 100644
--- a/lib/rack/handler/scgi.rb
+++ b/lib/rack/handler/scgi.rb
@@ -32,10 +32,13 @@ module Rack
         env["PATH_INFO"] = env["REQUEST_PATH"]
         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)
+
         env.update({"rack.version" => [1,0],
-                     "rack.input" => StringIO.new(input_body),
+                     "rack.input" => rack_input,
                      "rack.errors" => $stderr,
-
                      "rack.multithread" => true,
                      "rack.multiprocess" => true,
                      "rack.run_once" => false,
diff --git a/lib/rack/handler/webrick.rb b/lib/rack/handler/webrick.rb
index a8b6ff56..5b9ae740 100644
--- a/lib/rack/handler/webrick.rb
+++ b/lib/rack/handler/webrick.rb
@@ -23,8 +23,11 @@ module Rack
         env = req.meta_vars
         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)
+
         env.update({"rack.version" => [1,0],
-                     "rack.input" => StringIO.new(req.body.to_s),
+                     "rack.input" => rack_input,
                      "rack.errors" => $stderr,
 
                      "rack.multithread" => true,
diff --git a/lib/rack/mock.rb b/lib/rack/mock.rb
index fdefb034..4b85ea12 100644
--- a/lib/rack/mock.rb
+++ b/lib/rack/mock.rb
@@ -116,11 +116,14 @@ module Rack
 
       opts[:input] ||= ""
       if String === opts[:input]
-        env["rack.input"] = StringIO.new(opts[:input])
+        rack_input = StringIO.new(opts[:input])
       else
-        env["rack.input"] = opts[:input]
+        rack_input = opts[:input]
       end
 
+      rack_input.set_encoding(Encoding::BINARY) if rack_input.respond_to?(:set_encoding)
+      env['rack.input'] = rack_input
+
       env["CONTENT_LENGTH"] ||= env["rack.input"].length.to_s
 
       opts.each { |field, value|