about summary refs log tree commit homepage
path: root/lib/mongrel.rb
diff options
context:
space:
mode:
authorevanweaver <evanweaver@19e92222-5c0b-0410-8929-a290d50e31e9>2007-10-22 16:27:45 +0000
committerevanweaver <evanweaver@19e92222-5c0b-0410-8929-a290d50e31e9>2007-10-22 16:27:45 +0000
commit7192a5ec5895f5ded477178efe53b289ec5435a6 (patch)
tree7a2941e2ef1f70e5b237b2103df3e010c2a646b9 /lib/mongrel.rb
parentf2ee1eb89df96f020be368cdace67444adb0a551 (diff)
downloadunicorn-7192a5ec5895f5ded477178efe53b289ec5435a6.tar.gz
git-svn-id: svn+ssh://rubyforge.org/var/svn/mongrel/trunk@735 19e92222-5c0b-0410-8929-a290d50e31e9
Diffstat (limited to 'lib/mongrel.rb')
-rw-r--r--lib/mongrel.rb23
1 files changed, 16 insertions, 7 deletions
diff --git a/lib/mongrel.rb b/lib/mongrel.rb
index 87afe00..8debb28 100644
--- a/lib/mongrel.rb
+++ b/lib/mongrel.rb
@@ -53,6 +53,7 @@ module Mongrel
     def initialize
       @handler_map = {}
       @matcher = //
+      @root_handler = nil
     end
     
     # Register a handler object at a particular URI. The handler can be whatever
@@ -78,8 +79,11 @@ module Mongrel
     
     # Resolve a request URI by finding the best partial match in the registered
     # handler URIs.
-    def resolve(request_uri)      
-      if match = @matcher.match(request_uri)
+    def resolve(request_uri)
+      if @root_handler
+        # Optimization for the pathological case of only one handler on "/"; e.g. Rails
+        [Const::SLASH, request_uri, @root_handler]
+      elsif match = @matcher.match(request_uri)
         uri = match.to_s
         path_info = match.post_match
         # A root mounted ("/") handler must resolve such that path info matches the original URI.
@@ -93,12 +97,17 @@ module Mongrel
     private
     
     def rebuild
-      routes = @handler_map.keys.sort.sort_by do |uri|
-        -uri.length
+      if @handler_map.size == 1 and @handler_map[Const::SLASH]
+        @root_handler = @handler_map.values.first
+      else
+        @root_handler = nil
+        routes = @handler_map.keys.sort.sort_by do |uri|
+          -uri.length
+        end
+        @matcher = Regexp.new(routes.map do |uri|
+          Regexp.new('^' + Regexp.escape(uri))
+        end.join('|'))
       end
-      @matcher = Regexp.new(routes.map do |uri|
-        Regexp.new('^' + Regexp.escape(uri))
-      end.join('|'))
     end    
     
   end