diff --git a/lib/rack/request.rb b/lib/rack/request.rb index e6e46e9d1..7bd361f00 100644 --- a/lib/rack/request.rb +++ b/lib/rack/request.rb @@ -199,28 +199,27 @@ def GET # This method support both application/x-www-form-urlencoded and # multipart/form-data. def POST - if @env["rack.input"].nil? - raise "Missing rack.input" - elsif @env["rack.request.form_input"].equal? @env["rack.input"] - @env["rack.request.form_hash"] - elsif form_data? || parseable_data? - unless @env["rack.request.form_hash"] = parse_multipart(env) + raise "Missing rack.input" if @env["rack.input"].nil? + @env["rack.request.form_hash"] ||= {} + + if !(@env["rack.request.form_input"].equal? @env["rack.input"]) && (form_data? || parseable_data?) + parsed_result = parse_multipart(env) + if parsed_result + @env["rack.request.form_hash"].merge! parsed_result + else form_vars = @env["rack.input"].read - # Fix for Safari Ajax postings that always append \0 # form_vars.sub!(/\0\z/, '') # performance replacement: form_vars.slice!(-1) if form_vars[-1] == ?\0 @env["rack.request.form_vars"] = form_vars - @env["rack.request.form_hash"] = parse_query(form_vars) - + @env["rack.request.form_hash"].merge! parse_query(form_vars) @env["rack.input"].rewind end @env["rack.request.form_input"] = @env["rack.input"] - @env["rack.request.form_hash"] - else - {} end + + @env["rack.request.form_hash"] end # The union of GET and POST data.