Esempio n. 1
0
int bridge_request_destroy(bridge_request_t *self)
{
	json_object_put(self->response);
	json_tokener_free(self->tokener);
	FCGX_Free(&self->request, TRUE);
	return 0;
}
int main()
{
  CHICKEN_run(C_toplevel);

  FCGX_Request* request = malloc(sizeof(FCGX_Request));

  FCGX_Init();
  FCGX_InitRequest(request, 0, 0);

  while (FCGX_Accept_r(request) == 0)
  {
    http_handle_request(request);
    FCGX_Finish_r(request);
  }

  FCGX_Free(request, 1);

  free(request);
}
Esempio n. 3
0
/*
 *----------------------------------------------------------------------
 *
 * FCGX_Finish_r --
 *
 *      Finishes the current request from the HTTP server.
 *
 * Side effects:
 *
 *      Finishes the request accepted by (and frees any
 *      storage allocated by) the previous call to FCGX_Accept.
 *
 *      DO NOT retain pointers to the envp array or any strings
 *      contained in it (e.g. to the result of calling FCGX_GetParam),
 *      since these will be freed by the next call to FCGX_Finish
 *      or FCGX_Accept.
 *
 *----------------------------------------------------------------------
 */
void FCGX_Finish_r(FCGX_Request * reqDataPtr)
{
	int close;

	if (reqDataPtr == NULL) {
		return;
	}

	close = !reqDataPtr->keepConnection;

	/* This should probably use a 'status' member instead of 'in' */
	if (reqDataPtr->in) {
		close |= FCGX_FClose(reqDataPtr->err);
		close |= FCGX_FClose(reqDataPtr->out);

		close |= FCGX_GetError(reqDataPtr->in);
	}

	FCGX_Free(reqDataPtr, close);
}
Esempio n. 4
0
void
fastcgi_request_traits::destroy(FCGX_Request *req) {
	FCGX_Free(req, 1);
}
Esempio n. 5
0
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 (select(req->listen_sock+1, &readfds, NULL, NULL, NULL) < 1) {
    return Qnil;
  }

  status = FCGX_Accept_r(req);
  if (status >= 0) {
    fcgi_data *data;
    fcgi_stream_data *stream_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_Make_Struct(cFCGIStream, fcgi_stream_data, fcgi_stream_mark, fcgi_stream_free, stream_data);
    stream_data->stream = req->in;
    stream_data->req = obj;
    data->out = Data_Make_Struct(cFCGIStream, fcgi_stream_data, fcgi_stream_mark, fcgi_stream_free, stream_data);
    stream_data->stream = req->out;
    stream_data->req = obj;
    data->err = Data_Make_Struct(cFCGIStream, fcgi_stream_data, fcgi_stream_mark, fcgi_stream_free, stream_data);
    stream_data->stream = req->err;
    stream_data->req = obj;
    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 {
    FCGX_Free(req, 1);
    free(req);
    return Qnil;
  }
}
Esempio n. 6
0
static void fcgi_free_req(fcgi_data *data)
{
  FCGX_Free(data->req, 1);
  free(data->req);
  free(data);
}
Esempio n. 7
0
		~Worker4CloseThread(){
			FCGX_Free(&request, 0);
		}
Esempio n. 8
0
/*
 *----------------------------------------------------------------------
 *
 * FCGX_Accept_r --
 *
 *      Accepts a new request from the HTTP server.
 *
 * Results:
 *	0 for successful call, -1 for error.
 *
 * Side effects:
 *
 *      Finishes the request accepted by (and frees any
 *      storage allocated by) the previous call to FCGX_Accept.
 *      Creates input, output, and error streams and
 *      assigns them to *in, *out, and *err respectively.
 *      Creates a parameters data structure to be accessed
 *      via getenv(3) (if assigned to environ) or by FCGX_GetParam
 *      and assigns it to *envp.
 *
 *      DO NOT retain pointers to the envp array or any strings
 *      contained in it (e.g. to the result of calling FCGX_GetParam),
 *      since these will be freed by the next call to FCGX_Finish
 *      or FCGX_Accept.
 *
 *----------------------------------------------------------------------
 */
int FCGX_Accept_r(FCGX_Request * reqDataPtr)
{
	if (!libInitialized) {
		return -9998;
	}

	/* Finish the current request, if any. */
	FCGX_Finish_r(reqDataPtr);

	for (;;) {
		/*
		 * If a connection isn't open, accept a new connection (blocking).
		 * If an OS error occurs in accepting the connection,
		 * return -1 to the caller, who should exit.
		 */
		if (reqDataPtr->ipcFd < 0) {
			int fail_on_intr =
				reqDataPtr->flags & FCGI_FAIL_ACCEPT_ON_INTR;

			reqDataPtr->ipcFd =
				OS_Accept(reqDataPtr->listen_sock, fail_on_intr,
				webServerAddressList);
			if (reqDataPtr->ipcFd < 0) {
				return (errno > 0) ? (0 - errno) : -9999;
			}
		}
		/*
		 * A connection is open.  Read from the connection in order to
		 * get the request's role and environment.  If protocol or other
		 * errors occur, close the connection and try again.
		 */
		reqDataPtr->isBeginProcessed = FALSE;
		reqDataPtr->in = NewReader(reqDataPtr, 8192, 0);
		FillBuffProc(reqDataPtr->in);
		if (!reqDataPtr->isBeginProcessed) {
			goto TryAgain;
		}
		{
			char *roleStr;
			switch (reqDataPtr->role) {
			case FCGI_RESPONDER:
				roleStr = "FCGI_ROLE=RESPONDER";
				break;
			case FCGI_AUTHORIZER:
				roleStr = "FCGI_ROLE=AUTHORIZER";
				break;
			case FCGI_FILTER:
				roleStr = "FCGI_ROLE=FILTER";
				break;
			default:
				goto TryAgain;
			}
			reqDataPtr->paramsPtr = NewParams(30);
			PutParam(reqDataPtr->paramsPtr, StringCopy(roleStr));
		}
		SetReaderType(reqDataPtr->in, FCGI_PARAMS);
		if (ReadParams(reqDataPtr->paramsPtr, reqDataPtr->in) >= 0) {
			/*
			 * Finished reading the environment.  No errors occurred, so
			 * leave the connection-retry loop.
			 */
			break;
		}

		/*
		 * Close the connection and try again.
		 */
TryAgain:
		FCGX_Free(reqDataPtr, 1);

	}			/* for (;;) */
	/*
	 * Build the remaining data structures representing the new
	 * request and return successfully to the caller.
	 */
	SetReaderType(reqDataPtr->in, FCGI_STDIN);
	reqDataPtr->out = NewWriter(reqDataPtr, 8192, FCGI_STDOUT);
	reqDataPtr->err = NewWriter(reqDataPtr, 512, FCGI_STDERR);
	reqDataPtr->nWriters = 2;
	reqDataPtr->envp = reqDataPtr->paramsPtr->vec;
	return 0;
}
Esempio n. 9
0
void* Rok4Server::thread_loop ( void* arg ) {
    Rok4Server* server = ( Rok4Server* ) ( arg );
    FCGX_Request fcgxRequest;
    if ( FCGX_InitRequest ( &fcgxRequest, server->sock, FCGI_FAIL_ACCEPT_ON_INTR ) !=0 ) {
        LOGGER_FATAL ( _ ( "Le listener FCGI ne peut etre initialise" ) );
    }

    while ( server->isRunning() ) {
        std::string content;
        bool postRequest;

        int rc;
        if ( ( rc=FCGX_Accept_r ( &fcgxRequest ) ) < 0 ) {
            if ( rc != -4 ) { // Cas différent du redémarrage
                LOGGER_ERROR ( _ ( "FCGX_InitRequest renvoie le code d'erreur" ) << rc );
            }
            //std::cerr <<"FCGX_InitRequest renvoie le code d'erreur" << rc << std::endl;
            break;
        }
        //DEBUG: La boucle suivante permet de lister les valeurs dans fcgxRequest.envp
        /*char **p;
        for (p = fcgxRequest.envp; *p; ++p) {
            LOGGER_DEBUG((char*)*p);
        }*/

        Request* request;



        postRequest = ( server->servicesConf.isPostEnabled() ?strcmp ( FCGX_GetParam ( "REQUEST_METHOD",fcgxRequest.envp ),"POST" ) ==0:false );

        if ( postRequest ) { // Post Request
            char* contentBuffer = ( char* ) malloc ( sizeof ( char ) *200 );
            while ( FCGX_GetLine ( contentBuffer,200,fcgxRequest.in ) ) {
                content.append ( contentBuffer );
            }
            free ( contentBuffer );
            contentBuffer= NULL;
            LOGGER_DEBUG ( _ ( "Request Content :" ) << std::endl << content );
            request = new Request ( FCGX_GetParam ( "QUERY_STRING", fcgxRequest.envp ),
                                    FCGX_GetParam ( "HTTP_HOST", fcgxRequest.envp ),
                                    FCGX_GetParam ( "SCRIPT_NAME", fcgxRequest.envp ),
                                    FCGX_GetParam ( "HTTPS", fcgxRequest.envp ),
                                    content );



        } else { // Get Request

            /* On espère récupérer le nom du host tel qu'il est exprimé dans la requete avec HTTP_HOST.
             * De même, on espère récupérer le path tel qu'exprimé dans la requête avec SCRIPT_NAME.
             */

            request = new Request ( FCGX_GetParam ( "QUERY_STRING", fcgxRequest.envp ),
                                    FCGX_GetParam ( "HTTP_HOST", fcgxRequest.envp ),
                                    FCGX_GetParam ( "SCRIPT_NAME", fcgxRequest.envp ),
                                    FCGX_GetParam ( "HTTPS", fcgxRequest.envp )
                                  );
        }
        server->processRequest ( request, fcgxRequest );
        delete request;

        FCGX_Finish_r ( &fcgxRequest );
        FCGX_Free ( &fcgxRequest,1 );
    }
    LOGGER_DEBUG ( _ ( "Extinction du thread" ) );
    Logger::stopLogger();
    return 0;
}