From: Brian Candler Date: 2003-03-25T21:17:37+09:00 Subject: ruby-fcgi: proposed patch --oyUTqETQ0mS9luUI Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Here is a patch against Moonwolf's excellent ruby-fcgi-0.8.2, inspired by ahoward's mod_fcgi. The principle changes are: (1) Added an FCGI::each_cgi method #!/usr/bin/ruby require "fcgi" FCGI.each_cgi {|cgi| name = cgi['name'][0] puts cgi.header puts "You are #{name} " if name puts "Connecting from #{cgi.remote_addr}" } The above code runs without modification under FastCGI, as a standalone CGI, and from the keyboard. (I'd be interested to know if it runs under mod_ruby too). It also handles SIGPIPE and SIGUSR1, see below. (2) In the C version, added a dummy FCGI::Stream#binmode (this is needed because the standard CGI library calls stdinput.binmode when processing POST data) (3) Fixed mod_fcgi's flushing of the previous request when using POST. It turns out that constants CGI_PARAMS/CGI_COOKIES are created under the ::CGI module, not under ::FCGI::CGI (4) Sorted out signal handling in the C library, and as a side effect made it not block threads. It now calls rb_thread_select before FCGX_Accept_r. There is a fairly detailled description of how signal handling works in the attached patch as ext/fcgi/README.signals. But now, a SIGUSR1 during FCGI::each_cgi will either process a request in its entirety, or not at all. If you want protection from SIGTERM or other signals then you should install your own handler for the duration of the request, e.g. FCGI.each_cgi {|cgi| trap('SIGTERM') { exit_please = true } ... do stuff trap('SIGTERM','DEFAULT') break if exit_please end In principle, it *may* now be possible to run multiple FastCGI threads in a single process, by starting a new thread after each FCGI::accept call. I have not tried this. Talking of testing, plenty is needed. I have run this under FreeBSD-4.7 and Solaris-2.8 using the C library (fcgi-2.4.0). But I have not used the pure-Ruby version at all, as I don't have stringIO, and I have not tried any other OS including Windows. Neither have I tested under any version of Ruby other than 1.6.8, and it's possible there have been changes to the cgi.rb library. Enjoy... Brian. --oyUTqETQ0mS9luUI Content-Type: application/x-gunzip Content-Disposition: attachment; filename="ruby-fcgi-0.8.2.patch.gz" Content-Transfer-Encoding: base64 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 Q0T1Jo6TTbvVAZAn93n7xjk3UeD/sjEz+98gAAA= --oyUTqETQ0mS9luUI--