about summary refs log tree commit homepage
path: root/lib/mongrel/rails.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/mongrel/rails.rb')
-rw-r--r--lib/mongrel/rails.rb171
1 files changed, 86 insertions, 85 deletions
diff --git a/lib/mongrel/rails.rb b/lib/mongrel/rails.rb
index 8dc42a0..d2c714c 100644
--- a/lib/mongrel/rails.rb
+++ b/lib/mongrel/rails.rb
@@ -4,6 +4,92 @@ require 'cgi'
 module Mongrel
   module Rails
 
+
+    # Implements a handler that can run Rails and serve files out of the
+    # Rails application's public directory.  This lets you run your Rails
+    # application with Mongrel during development and testing, then use it
+    # also in production behind a server that's better at serving the
+    # static files.
+    #
+    # The RailsHandler takes a mime_map parameter which is a simple suffix=mimetype
+    # mapping that it should add to the list of valid mime types.
+    #
+    # It also supports page caching directly and will try to resolve a request
+    # in the following order:
+    #
+    # * If the requested exact PATH_INFO exists as a file then serve it.
+    # * If it exists at PATH_INFO+".html" exists then serve that.
+    # * Finally, construct a Mongrel::CGIWrapper and run Dispatcher.dispath to have Rails go.
+    #
+    # This means that if you are using page caching it will actually work with Mongrel
+    # and you should see a decent speed boost (but not as fast as if you use lighttpd).
+    #
+    # An additional feature you can use is
+    class RailsHandler < Mongrel::HttpHandler
+      attr_reader :files
+      attr_reader :guard
+      
+      def initialize(dir, mime_map = {})
+        @files = Mongrel::DirHandler.new(dir,false)
+        @guard = Mutex.new
+        
+        # register the requested mime types
+        mime_map.each {|k,v| Mongrel::DirHandler::add_mime_type(k,v) }
+      end
+      
+      # Attempts to resolve the request as follows:
+      #
+      #
+      # * If the requested exact PATH_INFO exists as a file then serve it.
+      # * If it exists at PATH_INFO+".html" exists then serve that.
+      # * Finally, construct a Mongrel::CGIWrapper and run Dispatcher.dispath to have Rails go.
+      def process(request, response)
+        return if response.socket.closed?
+        
+        path_info = request.params[Mongrel::Const::PATH_INFO]
+        page_cached = request.params[Mongrel::Const::PATH_INFO] + ".html"
+        
+        if @files.can_serve(path_info)
+            # File exists as-is so serve it up
+          @files.process(request,response)
+        elsif @files.can_serve(page_cached)
+          # possible cached page, serve it up      
+          request.params[Mongrel::Const::PATH_INFO] = page_cached
+          @files.process(request,response)
+        else
+          begin
+            cgi = Mongrel::CGIWrapper.new(request, response)
+            cgi.handler = self
+            
+            @guard.synchronize do
+              # Rails is not thread safe so must be run entirely within synchronize
+              Dispatcher.dispatch(cgi, ActionController::CgiRequest::DEFAULT_SESSION_OPTIONS, response.body)
+            end
+            
+            # This finalizes the output using the proper HttpResponse way
+            cgi.out {""}
+          rescue Errno::EPIPE
+            # ignored
+          rescue Object => rails_error
+            STDERR.puts "Error calling Dispatcher.dispatch #{rails_error.inspect}"
+            STDERR.puts rails_error.backtrace.join("\n")
+          end
+        end
+      end
+      
+      
+      # Does the internal reload for Rails.  It might work for most cases, but
+      # sometimes you get exceptions.  In that case just do a real restart.
+      def reload!
+        @guard.synchronize do
+          $".replace $orig_dollar_quote
+          GC.start
+          Dispatcher.reset_application!
+          ActionController::Routing::Routes.reload
+        end
+      end
+    end
+
     # Creates Rails specific configuration options for people to use
     # instead of the base Configurator.
     class RailsConfigurator < Mongrel::Configurator
@@ -86,91 +172,6 @@ module Mongrel
           log "WARNING:  Rails does not support signals on Win32."
         end
       end
-      
-      # Implements a handler that can run Rails and serve files out of the
-      # Rails application's public directory.  This lets you run your Rails
-      # application with Mongrel during development and testing, then use it
-      # also in production behind a server that's better at serving the
-      # static files.
-      #
-      # The RailsHandler takes a mime_map parameter which is a simple suffix=mimetype
-      # mapping that it should add to the list of valid mime types.
-      #
-      # It also supports page caching directly and will try to resolve a request
-      # in the following order:
-      #
-      # * If the requested exact PATH_INFO exists as a file then serve it.
-      # * If it exists at PATH_INFO+".html" exists then serve that.
-      # * Finally, construct a Mongrel::CGIWrapper and run Dispatcher.dispath to have Rails go.
-      #
-      # This means that if you are using page caching it will actually work with Mongrel
-      # and you should see a decent speed boost (but not as fast as if you use lighttpd).
-      #
-      # An additional feature you can use is
-      class RailsHandler < Mongrel::HttpHandler
-        attr_reader :files
-        attr_reader :guard
-        
-        def initialize(dir, mime_map = {})
-          @files = Mongrel::DirHandler.new(dir,false)
-          @guard = Mutex.new
-          
-          # register the requested mime types
-          mime_map.each {|k,v| Mongrel::DirHandler::add_mime_type(k,v) }
-        end
-        
-        # Attempts to resolve the request as follows:
-        #
-        #
-        # * If the requested exact PATH_INFO exists as a file then serve it.
-        # * If it exists at PATH_INFO+".html" exists then serve that.
-        # * Finally, construct a Mongrel::CGIWrapper and run Dispatcher.dispath to have Rails go.
-        def process(request, response)
-          return if response.socket.closed?
-          
-          path_info = request.params[Mongrel::Const::PATH_INFO]
-          page_cached = request.params[Mongrel::Const::PATH_INFO] + ".html"
-          
-          if @files.can_serve(path_info)
-            # File exists as-is so serve it up
-            @files.process(request,response)
-          elsif @files.can_serve(page_cached)
-            # possible cached page, serve it up      
-            request.params[Mongrel::Const::PATH_INFO] = page_cached
-            @files.process(request,response)
-          else
-            begin
-              cgi = Mongrel::CGIWrapper.new(request, response)
-              cgi.handler = self
-              
-              @guard.synchronize do
-                # Rails is not thread safe so must be run entirely within synchronize
-                Dispatcher.dispatch(cgi, ActionController::CgiRequest::DEFAULT_SESSION_OPTIONS, response.body)
-              end
-              
-              # This finalizes the output using the proper HttpResponse way
-              cgi.out {""}
-            rescue Errno::EPIPE
-              # ignored
-            rescue Object => rails_error
-              log "Error calling Dispatcher.dispatch #{rails_error.inspect}"
-              log rails_error.backtrace.join("\n")
-            end
-          end
-        end
-        
-  
-        # Does the internal reload for Rails.  It might work for most cases, but
-        # sometimes you get exceptions.  In that case just do a real restart.
-        def reload!
-          @guard.synchronize do
-            $".replace $orig_dollar_quote
-            GC.start
-            Dispatcher.reset_application!
-            ActionController::Routing::Routes.reload
-          end
-        end
-      end
     end
   end
 end