From 98a33bb30438c2bcbb10d48523afd9d491750a1e Mon Sep 17 00:00:00 2001 From: zedshaw Date: Wed, 8 Feb 2006 12:48:41 +0000 Subject: Fixed a bug in the Error404Handler. Created the first Rails runner script. git-svn-id: svn+ssh://rubyforge.org/var/svn/mongrel/trunk@21 19e92222-5c0b-0410-8929-a290d50e31e9 --- examples/mongrel_rails.rb | 73 +++++++++++++++++++++++++++++++++++++++++++++++ examples/simpletest.rb | 22 ++++++++++---- 2 files changed, 89 insertions(+), 6 deletions(-) create mode 100644 examples/mongrel_rails.rb (limited to 'examples') diff --git a/examples/mongrel_rails.rb b/examples/mongrel_rails.rb new file mode 100644 index 0000000..ab5b740 --- /dev/null +++ b/examples/mongrel_rails.rb @@ -0,0 +1,73 @@ +require 'mongrel' +require 'cgi' +require 'config/environment' + +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 + @guard = Mutex.new + end + + def process(request, response) + # not static, need to talk to rails + return if response.socket.closed? + + 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 + +if ARGV.length != 3 + STDERR.puts "usage: mongrel_rails.rb " + exit(1) +end + +h = Mongrel::HttpServer.new(ARGV[0], ARGV[1]) +h.register("/", Mongrel::DirHandler.new(ARGV[2])) +h.register("/app", RailsHandler.new) +h.run + +puts "Mongrel running on #{ARGV[0]}:#{ARGV[1]} with docroot #{ARGV[2]}" + +h.acceptor.join diff --git a/examples/simpletest.rb b/examples/simpletest.rb index 532e289..893df96 100644 --- a/examples/simpletest.rb +++ b/examples/simpletest.rb @@ -4,14 +4,24 @@ require 'yaml' class SimpleHandler < Mongrel::HttpHandler def process(request, response) response.start do |head,out| - head["Content-Type"] = "text/plain" - out.write("hello!\n") + head["Content-Type"] = "text/html" + out << "Your request:
" + out << "
#{request.params.to_yaml}
" + out << "View the files." end end end -h = Mongrel::HttpServer.new("0.0.0.0", "3000") -h.register("/test", SimpleHandler.new) -h.register("/files", Mongrel::DirHandler.new(".")) -h.run.join +if ARGV.length != 3 + STDERR.puts "usage: simpletest.rb " + exit(1) +end + +h = Mongrel::HttpServer.new(ARGV[0], ARGV[1]) +h.register("/", SimpleHandler.new) +h.register("/files", Mongrel::DirHandler.new(ARGV[2])) +h.run + +puts "Mongrel running on #{ARGV[0]}:#{ARGV[1]} with docroot #{ARGV[2]}" +h.acceptor.join -- cgit v1.2.3-24-ge0c7