RubyLearning / ProjectTrak / vendor / rails / railties / lib / rails / mongrel_server / handler.rb

# Copyright (c) 2005 Zed A. Shaw
# You can redistribute it and/or modify it under the same terms as Ruby.
# Additional work donated by contributors.  See
# for more information.

require 'mongrel'
require 'cgi'
require 'action_controller/dispatcher'

module Rails
  module MongrelServer
    # 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.dispatch 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 a static
    # server like Apache or Litespeed).
    class RailsHandler < Mongrel::HttpHandler
      # Construct a Mongrel::CGIWrapper and dispatch.
      def process(request, response)
        return if response.socket.closed?

        cgi =, response)
        cgi.handler = self
        # We don't want the output to be really final until we're out of the lock
        cgi.default_really_final = false

        ActionController::Dispatcher.dispatch(cgi, ActionController::CgiRequest::DEFAULT_SESSION_OPTIONS, response.body)

        # This finalizes the output using the proper HttpResponse way
        cgi.out("text/html",true) {""}
      rescue Errno::EPIPE
      rescue Object => rails_error
        STDERR.puts "#{}: Error dispatching #{rails_error.inspect}"
        STDERR.puts rails_error.backtrace.join("\n")
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.