class FCGI::Server

Constants

DATA_UNIT

Public Class Methods

new(server) click to toggle 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

each_request(&block) click to toggle 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
session() { |req| ... } click to toggle 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

handle_GET_VALUES(rec) click to toggle 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
next_request(sock) click to toggle 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
respond_to(req, sock, status) click to toggle 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
split_data(type, id, f) { |generic_data_record| ... } click to toggle 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