From 4f2553bbd394387f3f95715748ddba01cf4072ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20Ren=C3=A9=20Hanke?= Date: Thu, 21 Mar 2013 10:03:41 +1100 Subject: [PATCH] Fixes #688. --- lib/sinatra/base.rb | 40 ++++++++++++++++++++++------------------ 1 file changed, 22 insertions(+), 18 deletions(-) diff --git a/lib/sinatra/base.rb b/lib/sinatra/base.rb index a5bc1d71..2d5a6ab0 100644 --- a/lib/sinatra/base.rb +++ b/lib/sinatra/base.rb @@ -1414,34 +1414,38 @@ module Sinatra end def compile(path) - keys = [] if path.respond_to? :to_str - ignore = "" - pattern = path.to_str.gsub(/[^\?\%\\\/\:\*\w]/) do |c| - ignore << escaped(c).join if c.match(/[\.@]/) - patt = encoded(c) - patt.gsub(/%[\da-fA-F]{2}/) do |match| - match.split(//).map {|char| char =~ /[A-Z]/ ? "[#{char}#{char.tr('A-Z', 'a-z')}]" : char}.join + keys = [] + postfix = '/' if path[-1] == '/' + segments = path.split('/').map! do |segment| + ignore = "" + pattern = segment.to_str.gsub(/[^\?\%\\\/\:\*\w]/) do |c| + ignore << escaped(c).join if c.match(/[\.@]/) + patt = encoded(c) + patt.gsub(/%[\da-fA-F]{2}/) do |match| + match.split(//).map {|char| char =~ /[A-Z]/ ? "[#{char}#{char.tr('A-Z', 'a-z')}]" : char}.join + end end - end - pattern.gsub!(/((:\w+)|\*)/) do |match| - if match == "*" - keys << 'splat' - "(.*?)" - else - keys << $2[1..-1] - ignore_pattern = safe_ignore(ignore) + pattern.gsub!(/((:\w+)|\*)/) do |match| + if match == "*" + keys << 'splat' + "(.*?)" + else + keys << $2[1..-1] + ignore_pattern = safe_ignore(ignore) - ignore_pattern + ignore_pattern + end end + pattern end - [/\A#{pattern}\z/, keys] + [/\A#{segments.join('/')}#{postfix}\z/, keys] elsif path.respond_to?(:keys) && path.respond_to?(:match) [path, path.keys] elsif path.respond_to?(:names) && path.respond_to?(:match) [path, path.names] elsif path.respond_to? :match - [path, keys] + [path, []] else raise TypeError, path end