mirror of
https://github.com/github/rails.git
synced 2026-04-26 03:00:59 -04:00
Sync 'rails/rails/master'
This commit is contained in:
@@ -33,6 +33,7 @@ end
|
||||
|
||||
gem 'rack', '>= 0.9.0'
|
||||
require 'rack'
|
||||
require 'action_controller/rack_ext'
|
||||
|
||||
module ActionController
|
||||
# TODO: Review explicit to see if they will automatically be handled by
|
||||
@@ -79,7 +80,6 @@ module ActionController
|
||||
autoload :UrlEncodedPairParser, 'action_controller/url_encoded_pair_parser'
|
||||
autoload :UrlRewriter, 'action_controller/url_rewriter'
|
||||
autoload :UrlWriter, 'action_controller/url_rewriter'
|
||||
autoload :VerbPiggybacking, 'action_controller/verb_piggybacking'
|
||||
autoload :Verification, 'action_controller/verification'
|
||||
|
||||
module Assertions
|
||||
|
||||
@@ -2,17 +2,6 @@ require 'stringio'
|
||||
require 'uri'
|
||||
require 'active_support/test_case'
|
||||
|
||||
# Monkey patch Rack::Lint to support rewind
|
||||
module Rack
|
||||
class Lint
|
||||
class InputWrapper
|
||||
def rewind
|
||||
@input.rewind
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
module ActionController
|
||||
module Integration #:nodoc:
|
||||
# An integration Session instance represents a set of requests and responses
|
||||
|
||||
@@ -32,6 +32,8 @@ module ActionController
|
||||
else
|
||||
@klass.to_s.constantize
|
||||
end
|
||||
rescue NameError
|
||||
@klass
|
||||
end
|
||||
|
||||
def active?
|
||||
|
||||
@@ -19,4 +19,4 @@ use "ActiveRecord::QueryCache", :if => lambda { defined?(ActiveRecord) }
|
||||
end
|
||||
|
||||
use ActionController::RewindableInput
|
||||
use ActionController::VerbPiggybacking
|
||||
use Rack::MethodOverride
|
||||
|
||||
22
actionpack/lib/action_controller/rack_ext.rb
Normal file
22
actionpack/lib/action_controller/rack_ext.rb
Normal file
@@ -0,0 +1,22 @@
|
||||
module Rack
|
||||
module Utils
|
||||
module Multipart
|
||||
class << self
|
||||
def parse_multipart_with_rewind(env)
|
||||
result = parse_multipart_without_rewind(env)
|
||||
|
||||
begin
|
||||
env['rack.input'].rewind if env['rack.input'].respond_to?(:rewind)
|
||||
rescue Errno::ESPIPE
|
||||
# Handles exceptions raised by input streams that cannot be rewound
|
||||
# such as when using plain CGI under Apache
|
||||
end
|
||||
|
||||
result
|
||||
end
|
||||
|
||||
alias_method_chain :parse_multipart, :rewind
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -15,15 +15,19 @@ module ActionController
|
||||
@io.rewind
|
||||
end
|
||||
|
||||
def string
|
||||
@string
|
||||
end
|
||||
|
||||
def method_missing(method, *args, &block)
|
||||
@io.send(method, *args, &block)
|
||||
end
|
||||
|
||||
private
|
||||
def read_original_io
|
||||
unless @str
|
||||
@str = @io.read
|
||||
@io = StringIO.new(@str)
|
||||
unless @string
|
||||
@string = @io.read
|
||||
@io = StringIO.new(@string)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -1,24 +0,0 @@
|
||||
module ActionController
|
||||
# TODO: Use Rack::MethodOverride when it is released
|
||||
class VerbPiggybacking
|
||||
HTTP_METHODS = %w(GET HEAD PUT POST DELETE OPTIONS)
|
||||
|
||||
def initialize(app)
|
||||
@app = app
|
||||
end
|
||||
|
||||
def call(env)
|
||||
if env["REQUEST_METHOD"] == "POST"
|
||||
req = Request.new(env)
|
||||
if method = (req.parameters[:_method] || env["HTTP_X_HTTP_METHOD_OVERRIDE"])
|
||||
method = method.to_s.upcase
|
||||
if HTTP_METHODS.include?(method)
|
||||
env["REQUEST_METHOD"] = method
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@app.call(env)
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -200,7 +200,7 @@ class MultipartParamsParsingTest < ActionController::IntegrationTest
|
||||
def with_muck_middleware
|
||||
original_middleware = ActionController::Dispatcher.middleware
|
||||
middleware = original_middleware.dup
|
||||
middleware.use MuckMiddleware
|
||||
middleware.insert_after ActionController::RewindableInput, MuckMiddleware
|
||||
ActionController::Dispatcher.middleware = middleware
|
||||
yield
|
||||
ActionController::Dispatcher.middleware = original_middleware
|
||||
|
||||
@@ -183,7 +183,7 @@ class UrlEncodedParamsParsingTest < ActionController::IntegrationTest
|
||||
def with_muck_middleware
|
||||
original_middleware = ActionController::Dispatcher.middleware
|
||||
middleware = original_middleware.dup
|
||||
middleware.use MuckMiddleware
|
||||
middleware.insert_after ActionController::RewindableInput, MuckMiddleware
|
||||
ActionController::Dispatcher.middleware = middleware
|
||||
yield
|
||||
ActionController::Dispatcher.middleware = original_middleware
|
||||
|
||||
@@ -89,7 +89,7 @@ module ActiveRecord
|
||||
# - The block will be run without doing anything. All database statements
|
||||
# that happen within the block are effectively appended to the already
|
||||
# open database transaction.
|
||||
# - However, if +requires_new+ is set, the block will be wrapped in a
|
||||
# - However, if +:requires_new+ is set, the block will be wrapped in a
|
||||
# database savepoint acting as a sub-transaction.
|
||||
#
|
||||
# === Caveats
|
||||
@@ -113,8 +113,12 @@ module ActiveRecord
|
||||
def transaction(options = {})
|
||||
options.assert_valid_keys :requires_new, :joinable
|
||||
|
||||
last_transaction_joinable, @transaction_joinable =
|
||||
@transaction_joinable, options[:joinable] || true
|
||||
last_transaction_joinable = @transaction_joinable
|
||||
if options.has_key?(:joinable)
|
||||
@transaction_joinable = options[:joinable]
|
||||
else
|
||||
@transaction_joinable = true
|
||||
end
|
||||
requires_new = options[:requires_new] || !last_transaction_joinable
|
||||
|
||||
transaction_open = false
|
||||
@@ -141,7 +145,7 @@ module ActiveRecord
|
||||
rollback_to_savepoint
|
||||
end
|
||||
end
|
||||
raise unless database_transaction_rollback.is_a? ActiveRecord::Rollback
|
||||
raise unless database_transaction_rollback.is_a?(ActiveRecord::Rollback)
|
||||
end
|
||||
ensure
|
||||
@transaction_joinable = last_transaction_joinable
|
||||
|
||||
@@ -533,13 +533,11 @@ module ActiveRecord
|
||||
execute "ROLLBACK"
|
||||
end
|
||||
|
||||
if PGconn.public_method_defined?(:transaction_status)
|
||||
# ruby-pg defines Ruby constants for transaction status,
|
||||
# ruby-postgres does not.
|
||||
PQTRANS_IDLE = defined?(PGconn::PQTRANS_IDLE) ? PGconn::PQTRANS_IDLE : 0
|
||||
|
||||
if defined?(PGconn::PQTRANS_IDLE)
|
||||
# The ruby-pg driver supports inspecting the transaction status,
|
||||
# while the ruby-postgres driver does not.
|
||||
def outside_transaction?
|
||||
@connection.transaction_status == PQTRANS_IDLE
|
||||
@connection.transaction_status == PGconn::PQTRANS_IDLE
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -321,9 +321,8 @@ class TransactionTest < ActiveRecord::TestCase
|
||||
end
|
||||
end
|
||||
|
||||
if current_adapter?(:PostgreSQLAdapter) && PGconn.public_method_defined?(:transaction_status)
|
||||
if current_adapter?(:PostgreSQLAdapter) && defined?(PGconn::PQTRANS_IDLE)
|
||||
def test_outside_transaction_works
|
||||
Topic.logger.info("-------------")
|
||||
assert Topic.connection.outside_transaction?
|
||||
Topic.connection.begin_db_transaction
|
||||
assert !Topic.connection.outside_transaction?
|
||||
|
||||
@@ -537,7 +537,7 @@ Run `rake gems:install` to install the missing gems.
|
||||
end
|
||||
|
||||
def initialize_metal
|
||||
configuration.middleware.insert_before(:"ActionController::VerbPiggybacking", Rails::Rack::Metal)
|
||||
configuration.middleware.insert_before(:"ActionController::RewindableInput", Rails::Rack::Metal)
|
||||
end
|
||||
|
||||
# Initializes framework-specific settings for each of the loaded frameworks
|
||||
|
||||
Reference in New Issue
Block a user