X-Git-Url: https://git.njae.me.uk/?a=blobdiff_plain;f=vendor%2Frails%2Frailties%2Flib%2Frails%2Fmongrel_server%2Fhandler.rb;fp=vendor%2Frails%2Frailties%2Flib%2Frails%2Fmongrel_server%2Fhandler.rb;h=a19eca72594ad23f46e4e81072cf06567abd5af8;hb=d115f2e23823271635bad69229a42cd8ac68debe;hp=0000000000000000000000000000000000000000;hpb=37cb670bf3ddde90b214e591f100ed4446469484;p=depot.git diff --git a/vendor/rails/railties/lib/rails/mongrel_server/handler.rb b/vendor/rails/railties/lib/rails/mongrel_server/handler.rb new file mode 100644 index 0000000..a19eca7 --- /dev/null +++ b/vendor/rails/railties/lib/rails/mongrel_server/handler.rb @@ -0,0 +1,55 @@ +# 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 http://mongrel.rubyforge.org/attributions.html +# 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 = Mongrel::CGIWrapper.new(request, 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 + response.socket.close + rescue Object => rails_error + STDERR.puts "#{Time.now.httpdate}: Error dispatching #{rails_error.inspect}" + STDERR.puts rails_error.backtrace.join("\n") + end + end + end +end