diff --git a/lib/sinatra/base.rb b/lib/sinatra/base.rb index 22e91155..2209db97 100644 --- a/lib/sinatra/base.rb +++ b/lib/sinatra/base.rb @@ -28,6 +28,18 @@ module Sinatra else alias secure? ssl? end + + def route + @route ||= begin + path = Rack::Utils.unescape(path_info) + path.empty? ? "/" : path + end + end + + def path_info=(value) + @route = nil + super + end end # The response object. See Rack::Response and Rack::ResponseHelpers for @@ -635,11 +647,7 @@ module Sinatra # Returns pass block. def process_route(pattern, keys, conditions) @original_params ||= @params - @path ||= begin - path = unescape(@request.path_info) - path.empty? ? "/" : path - end - if match = pattern.match(@path) + if match = pattern.match(@request.route) values = match.captures.to_a params = if keys.any? diff --git a/test/filter_test.rb b/test/filter_test.rb index d9adb10e..693db9de 100644 --- a/test/filter_test.rb +++ b/test/filter_test.rb @@ -255,6 +255,16 @@ class AfterFilterTest < Test::Unit::TestCase assert ran_filter end + it 'changes to path_info from a pattern matching before filter are respoected when routing' do + mock_app do + before('/foo') { request.path_info = '/bar' } + get('/bar') { 'blah' } + end + get '/foo' + assert ok? + assert_equal 'blah', body + end + it 'generates block arguments from route pattern' do subpath = nil mock_app do