static VALUE fcgi_stream_gets(VALUE self) { FCGX_Stream *stream; char buff[BUFSIZ]; VALUE str = rb_str_new(0,0); OBJ_TAINT(str); if (rb_safe_level() >= 4 && !OBJ_TAINTED(self)) { rb_raise(rb_eSecurityError, "Insecure: operation on untainted IO"); } Data_Get_Struct(self, FCGX_Stream, stream); for (;;) { if (FCGX_GetLine(buff, BUFSIZ, stream) == NULL) { CHECK_STREAM_ERROR(stream); break; } rb_str_cat(str, buff, strlen(buff)); if (strchr(buff, '\n')) break; } if (RSTRING_LEN(str) > 0) return str; else return Qnil; }
Q_LONG FastCgiDevice::readLine( char *data, uint maxlen ) { // Return bytes read including \0 if ( FCGX_GetLine( data, maxlen, m_stream ) == 0 ) return 0; else return strnlen( data, maxlen ) + 1; }
char *FCGI_fgets(char *str, int size, FCGI_FILE *fp) { if(fp->stdio_stream) return fgets(str, size, fp->stdio_stream); else if(fp->fcgx_stream) return FCGX_GetLine(str, size, fp->fcgx_stream); return NULL; }
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; }