class FCGI::Server
Constants
- DATA_UNIT
Public Class Methods
Source
# File lib/fcgi.rb, line 94 def initialize(server) @server = server @buffers = {} @default_parameters = { "FCGI_MAX_CONNS" => 1, "FCGI_MAX_REQS" => 1, "FCGI_MPX_CONNS" => true } end
Public Instance Methods
Source
# File lib/fcgi.rb, line 104 def each_request(&block) graceful = false trap("SIGUSR1") { graceful = true } while true begin session(&block) rescue Errno::EPIPE, EOFError # HTTP request is canceled by the remote user end exit 0 if graceful end end
Source
# File lib/fcgi.rb, line 117 def session sock, addr = *@server.accept return unless sock fsock = FastCGISocket.new(sock) req = next_request(fsock) yield req respond_to req, fsock, FCGI_REQUEST_COMPLETE ensure sock.close if sock and not sock.closed? end
Private Instance Methods
Source
# File lib/fcgi.rb, line 158 def handle_GET_VALUES(rec) h = {} rec.values.each_key do |name| h[name] = @default_parameters[name] end ValuesRecord.new(FCGI_GET_VALUES_RESULT, rec.request_id, h) end
Source
# File lib/fcgi.rb, line 130 def next_request(sock) while rec = sock.read_record if rec.management_record? case rec.type when FCGI_GET_VALUES sock.send_record handle_GET_VALUES(rec) else sock.send_record UnknownTypeRecord.new(rec.request_id, rec.type) end else case rec.type when FCGI_BEGIN_REQUEST @buffers[rec.request_id] = RecordBuffer.new(rec) when FCGI_ABORT_REQUEST raise "got ABORT_REQUEST" # FIXME else buf = @buffers[rec.request_id] or next # inactive request buf.push rec if buf.ready? @buffers.delete rec.request_id return buf.new_request end end end end raise "must not happen: FCGI socket unexpected EOF" end
Source
# File lib/fcgi.rb, line 166 def respond_to(req, sock, status) split_data(FCGI_STDOUT, req.id, req.out) do |rec| sock.send_record rec end split_data(FCGI_STDERR, req.id, req.err) do |rec| sock.send_record rec end if req.err.length > 0 sock.send_record EndRequestRecord.new(req.id, 0, status) end
Source
# File lib/fcgi.rb, line 178 def split_data(type, id, f) unless f.length == 0 f.rewind while s = f.read(DATA_UNIT) yield GenericDataRecord.new(type, id, s) end end yield GenericDataRecord.new(type, id, '') end