Allow changing request.path_info in a before filter that has a pattern. Fixes #114.

This commit is contained in:
Konstantin Haase 2010-11-04 20:08:24 +01:00
parent aa06ed5e6d
commit 4988126624
2 changed files with 23 additions and 5 deletions

View File

@ -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?

View File

@ -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