class FCGI

Constants

FCGI_ABORT_REQUEST
FCGI_AUTHORIZER
FCGI_BEGIN_REQUEST

Record types

FCGI_CANT_MPX_CONN
FCGI_DATA
FCGI_END_REQUEST
FCGI_FILTER
FCGI_GET_VALUES
FCGI_GET_VALUES_RESULT
FCGI_KEEP_CONN

FCGI_BEGIN_REQUEST.flags

FCGI_MAXTYPE
FCGI_NULL_REQUEST_ID
FCGI_OVERLOADED
FCGI_PARAMS
FCGI_REQUEST_COMPLETE

FCGI_END_REQUEST.protocolStatus

FCGI_RESPONDER

FCGI_BEGIN_REQUSET.role

FCGI_STDERR
FCGI_STDIN
FCGI_STDOUT
FCGI_UNKNOWN_ROLE
FCGI_UNKNOWN_TYPE
ProtocolVersion

Public Class Methods

accept() click to toggle source
static VALUE fcgi_s_accept(VALUE self)
{
  int status;
  FCGX_Request *req;
  fd_set readfds;
  
  req = ALLOC(FCGX_Request);
  
  status = FCGX_InitRequest(req,0,0);
  if (status != 0) {
    rb_raise(eFCGIError, "FCGX_Init() failed");
    return Qnil;
  }

  FD_ZERO(&readfds);
  FD_SET(req->listen_sock, &readfds);
  if (rb_thread_select(req->listen_sock+1, &readfds, NULL, NULL, NULL) < 1) {
    return Qnil;
  }
  
  status = FCGX_Accept_r(req);
  if (status >= 0) {
    fcgi_data *data;
    char      **env;
    VALUE     obj,key, value;
    char      *pkey,*pvalue;
    int       flags, fd;

    /* Unset NONBLOCKING */
    fd = ((FCGX_Request*) req)->ipcFd;
    flags = fcntl(fd, F_GETFL);

    if (flags & O_NONBLOCK) {
       fcntl(fd, F_SETFL, flags & ~O_NONBLOCK);
    }
    
    obj = Data_Make_Struct(self, fcgi_data, fcgi_mark, fcgi_free_req, data);
    data->req = req;
    data->in  = Data_Wrap_Struct(cFCGIStream, 0, 0, req->in);
    data->out = Data_Wrap_Struct(cFCGIStream, 0, 0, req->out);
    data->err = Data_Wrap_Struct(cFCGIStream, 0, 0, req->err);
    data->env = rb_hash_new();
    env = req->envp;
    for (; *env; env++) {
      int size = 0;
      pkey = *env;
      pvalue = pkey;
      while( *(pvalue++) != '=') size++;
      key   = rb_str_new(pkey, size);
      value = rb_str_new2(pvalue);
      OBJ_TAINT(key);
      OBJ_TAINT(value);
      rb_hash_aset(data->env, key, value);
    }
    
    return obj;
  } else {
    return Qnil;
  }
}
default_connection() click to toggle source
# File lib/fcgi.rb, line 48
def self::default_connection
  ::Socket.for_fd($stdin.fileno)
end
each() click to toggle source
static VALUE fcgi_s_each(VALUE self)
{
  VALUE fcgi;
  
  while ((fcgi = fcgi_s_accept(self)) != Qnil) {
    rb_yield(fcgi);
  }
  return Qnil;
}
each_request() click to toggle source
static VALUE fcgi_s_each(VALUE self)
{
  VALUE fcgi;
  
  while ((fcgi = fcgi_s_accept(self)) != Qnil) {
    rb_yield(fcgi);
  }
  return Qnil;
}
is_cgi?() click to toggle source
static VALUE fcgi_s_iscgi(VALUE self)
{
  if (FCGX_IsCGI()) {
    return Qtrue;
  } else {
    return Qfalse;
  }
}

Public Instance Methods

env() click to toggle source
static VALUE fcgi_env(VALUE self)
{
  fcgi_data *data;

  Data_Get_Struct(self, fcgi_data, data);
  return data->env;
}
err() click to toggle source
static VALUE fcgi_err(VALUE self)
{
  fcgi_data *data;

  Data_Get_Struct(self, fcgi_data, data);
  return data->err;
}
finish() click to toggle source
static VALUE fcgi_finish(VALUE self)
{
  fcgi_data *data;
  
  Data_Get_Struct(self, fcgi_data, data);
  
  FCGX_Finish_r(data->req);
  
  return Qtrue;
}
in() click to toggle source
static VALUE fcgi_in(VALUE self)
{
  fcgi_data *data;

  Data_Get_Struct(self, fcgi_data, data);
  return data->in;
}
out() click to toggle source
static VALUE fcgi_out(VALUE self)
{
  fcgi_data *data;

  Data_Get_Struct(self, fcgi_data, data);
  return data->out;
}