diff options
author | David Heinemeier Hansson <david@loudthinking.com> | 2005-09-29 12:18:51 +0000 |
---|---|---|
committer | David Heinemeier Hansson <david@loudthinking.com> | 2005-09-29 12:18:51 +0000 |
commit | 0a0ac868453e9d8d9ee1dac6a7eb274772235b05 (patch) | |
tree | 1db7e1fce4d2c62f97c204ef72e7898c5263c82a /railties/lib/commands/ncgi/listener | |
parent | 070d218c479c8cbb41e78f599110f0ea1cf0343a (diff) | |
download | rails-0a0ac868453e9d8d9ee1dac6a7eb274772235b05.tar.gz rails-0a0ac868453e9d8d9ee1dac6a7eb274772235b05.tar.bz2 rails-0a0ac868453e9d8d9ee1dac6a7eb274772235b05.zip |
Removed all the scripts in script/* and replaced it with one generic portal: script/run
git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@2411 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
Diffstat (limited to 'railties/lib/commands/ncgi/listener')
-rw-r--r-- | railties/lib/commands/ncgi/listener | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/railties/lib/commands/ncgi/listener b/railties/lib/commands/ncgi/listener new file mode 100644 index 0000000000..421c453f23 --- /dev/null +++ b/railties/lib/commands/ncgi/listener @@ -0,0 +1,86 @@ +#!/usr/local/bin/ruby + +require 'stringio' +require 'fileutils' +require 'fcgi_handler' + +def message(s) + $stderr.puts "listener: #{s}" if ENV && ENV["DEBUG_GATEWAY"] +end + +class RemoteCGI < CGI + attr_accessor :stdinput, :stdoutput, :env_table + def initialize(env_table, input = nil, output = nil) + self.env_table = env_table + self.stdinput = input || StringIO.new + self.stdoutput = output || StringIO.new + super() + end + + def out(stream) # Ignore the requested output stream + super(stdoutput) + end +end + +class Listener + include DRbUndumped + + def initialize(timeout, socket_path) + @socket = File.expand_path(socket_path) + @mutex = Mutex.new + @active = false + @timeout = timeout + + @handler = RailsFCGIHandler.new + @handler.extend DRbUndumped + + message 'opening socket' + DRb.start_service("drbunix:#{@socket}", self) + + message 'entering process loop' + @handler.process! self + end + + def each_cgi(&cgi_block) + @cgi_block = cgi_block + message 'entering idle loop' + loop do + sleep @timeout rescue nil + die! unless @active + @active = false + end + end + + def process(env, input) + message 'received request' + @mutex.synchronize do + @active = true + + message 'creating input stream' + input_stream = StringIO.new(input) + message 'building CGI instance' + cgi = RemoteCGI.new(eval(env), input_stream) + + message 'yielding to fcgi handler' + @cgi_block.call cgi + message 'yield finished -- sending output' + + cgi.stdoutput.seek(0) + output = cgi.stdoutput.read + + return output + end + end + + def die! + message 'shutting down' + DRb.stop_service + FileUtils.rm_f @socket + Kernel.exit 0 + end +end + +socket_path = ARGV.shift +timeout = (ARGV.shift || 90).to_i + +Listener.new(timeout, socket_path)
\ No newline at end of file |