From 3c343cca6b736e43c6145ebdf60aed2cd61b912c Mon Sep 17 00:00:00 2001 From: zedshaw Date: Fri, 10 Feb 2006 01:06:55 +0000 Subject: Created rails runner, started making it daemon capable. git-svn-id: svn+ssh://rubyforge.org/var/svn/mongrel/trunk@23 19e92222-5c0b-0410-8929-a290d50e31e9 --- bin/mongrel_rails | 89 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 bin/mongrel_rails (limited to 'bin') diff --git a/bin/mongrel_rails b/bin/mongrel_rails new file mode 100644 index 0000000..3f7b124 --- /dev/null +++ b/bin/mongrel_rails @@ -0,0 +1,89 @@ +require 'config/environment' +require 'mongrel' +require 'cgi' +begin + require 'daemons/daemonize' + HAVE_DAEMONS=true +rescue + HAVE_DAEMONS=false +end + + +class CGIFixed < ::CGI + public :env_table + + def initialize(params, data, out, *args) + @env_table = params + @args = *args + @input = StringIO.new(data) + @out = out + super(*args) + end + + def args + @args + end + + def env_table + @env_table + end + + def stdinput + @input + end + + def stdoutput + @out + end +end + + +class RailsHandler < Mongrel::HttpHandler + def initialize(dir) + @files = Mongrel::DirHandler.new(dir,false) + @guard = Mutex.new + end + + def process(request, response) + # not static, need to talk to rails + return if response.socket.closed? + + if @files.can_serve(request.params["PATH_INFO"]) + @files.process(request,response) + else + cgi = CGIFixed.new(request.params, request.body, response.socket) + begin + + @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 + + response.send_status + response.send_body + rescue IOError + @log.error("received IOError #$! when handling client. Your web server doesn't like me.") + rescue Object => rails_error + @log.error("calling Dispatcher.dispatch", rails_error) + end + end + end +end + + +if ARGV.length != 2 + STDERR.puts "usage: mongrel_rails " + exit(1) +end + +cwd = Dir.pwd + +#Daemonize.daemonize(log_file=File.join(cwd,"log","mongrel.log")) +#Dir.chdir(cwd) + +open(File.join(cwd,"log/mongrel-#{ARGV[1]}.pid"),"w") {|f| f.write(Process.pid) } +h = Mongrel::HttpServer.new(ARGV[0], ARGV[1]) +h.register("/", RailsHandler.new(File.join(cwd,"public"))) +h.run + +h.acceptor.join -- cgit v1.2.3-24-ge0c7