Can't use ActionDispatch::Request in Rails middleware because path_parameters get lost


I just encountered a bit of an issue where we call request.params of
an ActionDispatch::Request inside a rack middleware right before a
Rails 3.0.3 app. The issue is that the path_parameters never appear
in the parameters hash if you call request.params before the rails

It seems that that the requests.params method memoizes itself in
"action_dispatch.request.parameters" without the parsed
path_parameters. The router seems to properly extract the path params
but never calls request.path_parameters= method which would properly
reset the memoized 'parameters' method.

You can see the code in question here:

      # file: action_dispatch/http/parameters.rb
      # Returns both GET and POST \parameters in a single hash.
      def parameters
        @env["action_dispatch.request.parameters"] ||= begin
          params = request_parameters.merge(query_parameters)
      alias :params :parameters

      def path_parameters=(parameters) #:nodoc:
        @symbolized_path_params = nil
        @env["action_dispatch.request.path_parameters"] = parameters

You can also see the Router Dispatcher directly grabbing the
path_parameters from the environment instead of going to through the
request object.

      #file: action_dispatch/routing/route_set.rb
      class RouteSet
      PARAMETERS_KEY = 'action_dispatch.request.path_parameters'

      class Dispatcher #:nodoc:
        def initialize(options={})
          @defaults = options[:defaults]
          @glob_param = options.delete(:glob)
          @controllers = {}

        def call(env)
          params = env[PARAMETERS_KEY]

For now, I've moved to using a Rack::Request object which is a shame
because I had to manually extract out the subdomain and the bug wasn't
very intuitive.

Let me know if I can help with this.