2012-01-23 119 views
4

我目前正在使用Apache和mod_fcgid使用FastCGI的Web C++应用程序。FastCGI:检索请求标头

我试图检索请求的标题,但我没有找到如何做。一些研究之后,我认为头是在“FCGX_Request”的属性“envp”,但它包含环境变量,例如:

REMOTE_ADDR: 192.168.0.50 
SERVER_SOFTWARE: Apache/2.2.21 (Unix) mod_ssl/2.2.21 OpenSSL/1.0.0f DAV/2 mod_fcgid/2.3.6 
REDIRECT_UNIQUE_ID: TxytP38AAAEAABpcDskAAAAE 
FCGI_ROLE: RESPONDER 
HTTP_ACCEPT_LANGUAGE: fr 
SERVER_SIGNATURE: <address>Apache/2.2.21 [etc.] 

这些变量给我提供有用的信息,但我需要真正的HTTP头,特别是“Cookie”。我尝试读取“FCGX_Request”中的“in”流,但似乎是请求主体(POST数据)。由于我的申请意欲是多线程的,我用“FCGX_Accept_r()”,类似这样的:

while(true) 
{ 
    FCGX_Init(); 
    FCGX_Request* fcgiRequest = new FCGX_Request; 
    FCGX_InitRequest(fcgiRequest, 0, 0); 

    if(FCGX_Accept_r(fcgiRequest) < 0) 
     break; 

    Request* request = new Request(fcgiRequest); 
    request->process(); 
} 

但实际上,我不使用线程。请求被一个接一个地执行。

如何获取请求标头?

谢谢。

+1

fcgiRequest-> envp是获取它们的正确位置。你发布了所有的环境变量吗?应该有一堆以HTTP_开头的HTTP头文件。如果这些都是你得到的,也许你在处理它们的方式上有一个错误。你可以在处理envp的地方发布代码吗? – Eelke

回答

6

请尝试下面的代码。它应该打印出整个环境,以便找到您要查找的变量。

while(true) 
{ 
    FCGX_Init(); 
    FCGX_Request* fcgiRequest = new FCGX_Request; 
    FCGX_InitRequest(fcgiRequest, 0, 0); 

    if(FCGX_Accept_r(fcgiRequest) < 0) 
     break; 

    char **env = fcgiRequest->envp; 
    while (*(++env)) 
     puts(*env); 


    Request* request = new Request(fcgiRequest); 
    request->process(); 
}