From dde5b8737bf7ec666f96ae04479074dfae7a63d9 Mon Sep 17 00:00:00 2001
From: Trek Glowacki <trek.glowacki@gmail.com>
Date: Tue, 16 Aug 2011 16:27:07 -0400
Subject: When a route references a missing controller, raise
 ActionController::RoutingError with a clearer message

---
 actionpack/lib/action_dispatch/routing/route_set.rb | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

(limited to 'actionpack/lib/action_dispatch')

diff --git a/actionpack/lib/action_dispatch/routing/route_set.rb b/actionpack/lib/action_dispatch/routing/route_set.rb
index 11228c597d..15a6415342 100644
--- a/actionpack/lib/action_dispatch/routing/route_set.rb
+++ b/actionpack/lib/action_dispatch/routing/route_set.rb
@@ -556,9 +556,13 @@ module ActionDispatch
             dispatcher = dispatcher.app
           end
 
-          if dispatcher.is_a?(Dispatcher) && dispatcher.controller(params, false)
-            dispatcher.prepare_params!(params)
-            return params
+          if dispatcher.is_a?(Dispatcher)
+            if dispatcher.controller(params, false)
+              dispatcher.prepare_params!(params)
+              return params
+            else
+              raise ActionController::RoutingError, "A route matches #{path.inspect}, but references missing controller: #{params[:controller].camelize}Controller"
+            end
           end
         end
 
-- 
cgit v1.2.3


From dcce01132de9734c9f7a6973bfff1b16b07ef84a Mon Sep 17 00:00:00 2001
From: David Chelimsky <dchelimsky@gmail.com>
Date: Sat, 19 May 2012 16:28:14 -0500
Subject: Raise Assertion instead of RoutingError for routing assertion
 failures.

Before this change, assert_recognizes, assert_generates, and
assert_routing raised ActionController::RoutingError when they failed to
recognize the route.

This commit changes them to raise Assertion instead. This aligns with
convention for logical failures, and supports reporting tools that care
about the difference between logical failures and errors e.g. the
summary at the end of a test run.

- Fixes #5899
---
 .../action_dispatch/testing/assertions/routing.rb    | 20 +++++++++++++-------
 1 file changed, 13 insertions(+), 7 deletions(-)

(limited to 'actionpack/lib/action_dispatch')

diff --git a/actionpack/lib/action_dispatch/testing/assertions/routing.rb b/actionpack/lib/action_dispatch/testing/assertions/routing.rb
index 567ca0c392..41fa3a4b95 100644
--- a/actionpack/lib/action_dispatch/testing/assertions/routing.rb
+++ b/actionpack/lib/action_dispatch/testing/assertions/routing.rb
@@ -69,11 +69,9 @@ module ActionDispatch
       #   assert_generates "changesets/12", { :controller => 'scm', :action => 'show_diff', :revision => "12" }
       def assert_generates(expected_path, options, defaults={}, extras = {}, message=nil)
         if expected_path =~ %r{://}
-          begin
+          fail_on(URI::InvalidURIError) do
             uri = URI.parse(expected_path)
             expected_path = uri.path.to_s.empty? ? "/" : uri.path
-          rescue URI::InvalidURIError => e
-            raise ActionController::RoutingError, e.message
           end
         else
           expected_path = "/#{expected_path}" unless expected_path.first == '/'
@@ -189,14 +187,12 @@ module ActionDispatch
           request = ActionController::TestRequest.new
 
           if path =~ %r{://}
-            begin
+            fail_on(URI::InvalidURIError) do
               uri = URI.parse(path)
               request.env["rack.url_scheme"] = uri.scheme || "http"
               request.host = uri.host if uri.host
               request.port = uri.port if uri.port
               request.path = uri.path.to_s.empty? ? "/" : uri.path
-            rescue URI::InvalidURIError => e
-              raise ActionController::RoutingError, e.message
             end
           else
             path = "/#{path}" unless path.first == "/"
@@ -205,11 +201,21 @@ module ActionDispatch
 
           request.request_method = method if method
 
-          params = @routes.recognize_path(path, { :method => method, :extras => extras })
+          params = fail_on(ActionController::RoutingError) do
+            @routes.recognize_path(path, { :method => method, :extras => extras })
+          end
           request.path_parameters = params.with_indifferent_access
 
           request
         end
+
+        def fail_on(exception_class)
+          begin
+            yield
+          rescue exception_class => e
+            raise MiniTest::Assertion, e.message
+          end
+        end
     end
   end
 end
-- 
cgit v1.2.3


From 972376a9952ce3a1cb1babb9e408900d314ac577 Mon Sep 17 00:00:00 2001
From: Andrew White <andyw@pixeltrix.co.uk>
Date: Sun, 20 May 2012 09:58:15 +0100
Subject: Correct order of expected and actual arguments

---
 actionpack/lib/action_dispatch/testing/assertions/response.rb | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

(limited to 'actionpack/lib/action_dispatch')

diff --git a/actionpack/lib/action_dispatch/testing/assertions/response.rb b/actionpack/lib/action_dispatch/testing/assertions/response.rb
index 3d121b6b9c..b4c8f839ac 100644
--- a/actionpack/lib/action_dispatch/testing/assertions/response.rb
+++ b/actionpack/lib/action_dispatch/testing/assertions/response.rb
@@ -28,7 +28,7 @@ module ActionDispatch
             assert @response.send("#{type}?"), message
           else
             code = Rack::Utils::SYMBOL_TO_STATUS_CODE[type]
-            assert_equal @response.response_code, code, message
+            assert_equal code, @response.response_code, message
           end
         else
           assert_equal type, @response.response_code, message
-- 
cgit v1.2.3


From 66eb3f02cc0894f08c4f912ba8bf6fb1f87e9a4a Mon Sep 17 00:00:00 2001
From: Andrew White <andyw@pixeltrix.co.uk>
Date: Sun, 20 May 2012 10:04:12 +0100
Subject: Raise ActionController::BadRequest for malformed parameter hashes.

Currently Rack raises a TypeError when it encounters a malformed or
ambiguous hash like `foo[]=bar&foo[4]=bar`. Rather than pass this
through to the application this commit captures the exception and
re-raises it using a new ActionController::BadRequest exception.

The new ActionController::BadRequest exception returns a 400 error
instead of the 500 error that would've been returned by the original
TypeError. This allows exception notification libraries to ignore
these errors if so desired.

Closes #3051
---
 actionpack/lib/action_dispatch/http/request.rb              | 13 ++++++++++---
 .../lib/action_dispatch/middleware/exception_wrapper.rb     |  3 ++-
 2 files changed, 12 insertions(+), 4 deletions(-)

(limited to 'actionpack/lib/action_dispatch')

diff --git a/actionpack/lib/action_dispatch/http/request.rb b/actionpack/lib/action_dispatch/http/request.rb
index 56908b5794..aa5ba3e8a5 100644
--- a/actionpack/lib/action_dispatch/http/request.rb
+++ b/actionpack/lib/action_dispatch/http/request.rb
@@ -231,17 +231,24 @@ module ActionDispatch
 
     # Override Rack's GET method to support indifferent access
     def GET
-      @env["action_dispatch.request.query_parameters"] ||= (normalize_parameters(super) || {})
+      begin
+        @env["action_dispatch.request.query_parameters"] ||= (normalize_parameters(super) || {})
+      rescue TypeError => e
+        raise ActionController::BadRequest, "Invalid query parameters: #{e.message}"
+      end
     end
     alias :query_parameters :GET
 
     # Override Rack's POST method to support indifferent access
     def POST
-      @env["action_dispatch.request.request_parameters"] ||= (normalize_parameters(super) || {})
+      begin
+        @env["action_dispatch.request.request_parameters"] ||= (normalize_parameters(super) || {})
+      rescue TypeError => e
+        raise ActionController::BadRequest, "Invalid request parameters: #{e.message}"
+      end
     end
     alias :request_parameters :POST
 
-
     # Returns the authorization header regardless of whether it was specified directly or through one of the
     # proxy alternatives.
     def authorization
diff --git a/actionpack/lib/action_dispatch/middleware/exception_wrapper.rb b/actionpack/lib/action_dispatch/middleware/exception_wrapper.rb
index a8f49bd3bd..7349b578d2 100644
--- a/actionpack/lib/action_dispatch/middleware/exception_wrapper.rb
+++ b/actionpack/lib/action_dispatch/middleware/exception_wrapper.rb
@@ -12,7 +12,8 @@ module ActionDispatch
       'ActionController::MethodNotAllowed'         => :method_not_allowed,
       'ActionController::NotImplemented'           => :not_implemented,
       'ActionController::UnknownFormat'            => :not_acceptable,
-      'ActionController::InvalidAuthenticityToken' => :unprocessable_entity
+      'ActionController::InvalidAuthenticityToken' => :unprocessable_entity,
+      'ActionController::BadRequest'               => :bad_request
     )
 
     cattr_accessor :rescue_templates
-- 
cgit v1.2.3


From 3fc561a1f71edf1c2bae695cafa03909d24a5ca3 Mon Sep 17 00:00:00 2001
From: Andrew White <andyw@pixeltrix.co.uk>
Date: Sun, 20 May 2012 16:44:42 +0100
Subject: Return 400 Bad Request for URL paths with invalid encoding.

Passing path parameters with invalid encoding is likely to trigger errors
further on like `ArgumentError (invalid byte sequence in UTF-8)`. This will
result in a 500 error whereas the better error to return is a 400 error which
allows exception notification libraries to filter it out if they wish.

Closes #4450
---
 actionpack/lib/action_dispatch/routing/redirection.rb | 9 +++++++++
 actionpack/lib/action_dispatch/routing/route_set.rb   | 9 +++++++++
 2 files changed, 18 insertions(+)

(limited to 'actionpack/lib/action_dispatch')

diff --git a/actionpack/lib/action_dispatch/routing/redirection.rb b/actionpack/lib/action_dispatch/routing/redirection.rb
index b3823bb496..205ff44b1c 100644
--- a/actionpack/lib/action_dispatch/routing/redirection.rb
+++ b/actionpack/lib/action_dispatch/routing/redirection.rb
@@ -2,6 +2,7 @@ require 'action_dispatch/http/request'
 require 'active_support/core_ext/uri'
 require 'active_support/core_ext/array/extract_options'
 require 'rack/utils'
+require 'action_controller/metal/exceptions'
 
 module ActionDispatch
   module Routing
@@ -16,6 +17,14 @@ module ActionDispatch
       def call(env)
         req = Request.new(env)
 
+        # If any of the path parameters has a invalid encoding then
+        # raise since it's likely to trigger errors further on.
+        req.symbolized_path_parameters.each do |key, value|
+          unless value.valid_encoding?
+            raise ActionController::BadRequest, "Invalid parameter: #{key} => #{value}"
+          end
+        end
+
         uri = URI.parse(path(req.symbolized_path_parameters, req))
         uri.scheme ||= req.scheme
         uri.host   ||= req.host
diff --git a/actionpack/lib/action_dispatch/routing/route_set.rb b/actionpack/lib/action_dispatch/routing/route_set.rb
index 0ae668d42a..1d0a67d0d2 100644
--- a/actionpack/lib/action_dispatch/routing/route_set.rb
+++ b/actionpack/lib/action_dispatch/routing/route_set.rb
@@ -26,6 +26,15 @@ module ActionDispatch
 
         def call(env)
           params = env[PARAMETERS_KEY]
+
+          # If any of the path parameters has a invalid encoding then
+          # raise since it's likely to trigger errors further on.
+          params.each do |key, value|
+            unless value.valid_encoding?
+              raise ActionController::BadRequest, "Invalid parameter: #{key} => #{value}"
+            end
+          end
+
           prepare_params!(params)
 
           # Just raise undefined constant errors if a controller was specified as default.
-- 
cgit v1.2.3


From 89ebd28d4ec899d840bddbef7711983a1ae2a162 Mon Sep 17 00:00:00 2001
From: Marc-Andre Lafortune <github@marc-andre.ca>
Date: Mon, 21 May 2012 15:24:18 -0400
Subject: Fix bug when Rails.application is defined but is nil. See #881

---
 actionpack/lib/action_dispatch/testing/test_request.rb | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

(limited to 'actionpack/lib/action_dispatch')

diff --git a/actionpack/lib/action_dispatch/testing/test_request.rb b/actionpack/lib/action_dispatch/testing/test_request.rb
index d04be2099c..a86b510719 100644
--- a/actionpack/lib/action_dispatch/testing/test_request.rb
+++ b/actionpack/lib/action_dispatch/testing/test_request.rb
@@ -11,7 +11,7 @@ module ActionDispatch
     end
 
     def initialize(env = {})
-      env = Rails.application.env_config.merge(env) if defined?(Rails.application)
+      env = Rails.application.env_config.merge(env) if defined?(Rails.application) && Rails.application
       super(DEFAULT_ENV.merge(env))
 
       self.host        = 'test.host'
-- 
cgit v1.2.3


From 6ac458d3417cc3dff064ddf0167d3afff6043cf9 Mon Sep 17 00:00:00 2001
From: Philip Arndt <parndt@gmail.com>
Date: Wed, 23 May 2012 14:24:08 +1200
Subject: Added ActionDispatch::Request::Session#keys and
 ActionDispatch::Request::Session#values

---
 actionpack/lib/action_dispatch/request/session.rb | 8 ++++++++
 1 file changed, 8 insertions(+)

(limited to 'actionpack/lib/action_dispatch')

diff --git a/actionpack/lib/action_dispatch/request/session.rb b/actionpack/lib/action_dispatch/request/session.rb
index 4ad7071820..d8bcc28613 100644
--- a/actionpack/lib/action_dispatch/request/session.rb
+++ b/actionpack/lib/action_dispatch/request/session.rb
@@ -87,6 +87,14 @@ module ActionDispatch
       alias :key? :has_key?
       alias :include? :has_key?
 
+      def keys
+        @delegate.keys
+      end
+
+      def values
+        @delegate.values
+      end
+
       def []=(key, value)
         load_for_write!
         @delegate[key.to_s] = value
-- 
cgit v1.2.3


From 73db73fee931e087317261fe9373228b5c0f1ed1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jos=C3=A9=20Valim?= <jose.valim@gmail.com>
Date: Fri, 25 May 2012 09:27:39 +0200
Subject: Remove implicit dependency on pathname

---
 actionpack/lib/action_dispatch/routing/mapper.rb | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

(limited to 'actionpack/lib/action_dispatch')

diff --git a/actionpack/lib/action_dispatch/routing/mapper.rb b/actionpack/lib/action_dispatch/routing/mapper.rb
index 67a208263b..e43e897783 100644
--- a/actionpack/lib/action_dispatch/routing/mapper.rb
+++ b/actionpack/lib/action_dispatch/routing/mapper.rb
@@ -1318,7 +1318,7 @@ module ActionDispatch
 
         def draw(name)
           path = @draw_paths.find do |_path|
-            _path.join("#{name}.rb").file?
+            File.exists? "#{_path}/#{name}.rb"
           end
 
           unless path
@@ -1328,8 +1328,8 @@ module ActionDispatch
             raise ArgumentError, msg
           end
           
-          route_path = path.join("#{name}.rb")
-          instance_eval(route_path.read, route_path.to_s)
+          route_path = "#{path}/#{name}.rb"
+          instance_eval(File.read(route_path), route_path.to_s)
         end
 
         # match 'path' => 'controller#action'
-- 
cgit v1.2.3


From 17eedd8e07d01a72ea11b9ee616c7dfdea4dc9ef Mon Sep 17 00:00:00 2001
From: Mikhail Vaysman <9996113+github@gmail.com>
Date: Fri, 25 May 2012 16:58:43 +0400
Subject: references to the old behavior removed

---
 actionpack/lib/action_dispatch/testing/integration.rb | 7 +++----
 1 file changed, 3 insertions(+), 4 deletions(-)

(limited to 'actionpack/lib/action_dispatch')

diff --git a/actionpack/lib/action_dispatch/testing/integration.rb b/actionpack/lib/action_dispatch/testing/integration.rb
index 08fd28d72d..3fdc6688c2 100644
--- a/actionpack/lib/action_dispatch/testing/integration.rb
+++ b/actionpack/lib/action_dispatch/testing/integration.rb
@@ -17,8 +17,8 @@ module ActionDispatch
       #   a Hash, or a String that is appropriately encoded
       #   (<tt>application/x-www-form-urlencoded</tt> or
       #   <tt>multipart/form-data</tt>).
-      # - +headers+: Additional HTTP headers to pass, as a Hash. The keys will
-      #   automatically be upcased, with the prefix 'HTTP_' added if needed.
+      # - +headers+: Additional headers to pass, as a Hash. The headers will be
+      #   merged into the Rack env hash.
       #
       # This method returns an Response object, which one can use to
       # inspect the details of the response. Furthermore, if this method was
@@ -73,8 +73,7 @@ module ActionDispatch
       #
       # The request_method is +:get+, +:post+, +:patch+, +:put+, +:delete+ or
       # +:head+; the parameters are +nil+, a hash, or a url-encoded or multipart
-      # string; the headers are a hash.  Keys are automatically upcased and
-      # prefixed with 'HTTP_' if not already.
+      # string; the headers are a hash.
       def xml_http_request(request_method, path, parameters = nil, headers = nil)
         headers ||= {}
         headers['HTTP_X_REQUESTED_WITH'] = 'XMLHttpRequest'
-- 
cgit v1.2.3