FastCGI:检索请求标头

les*_*enk 4 c c++ fastcgi

我目前正在使用带有Apache和mod_fcgid的FastCGI开发Web C++应用程序.

我正在尝试检索请求的标头,但我没有找到如何执行此操作.经过一些研究,我认为标题位于"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.]
Run Code Online (Sandbox Code Playgroud)

这些变量为我提供了有用的信息,但我需要真正的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();
}
Run Code Online (Sandbox Code Playgroud)

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

如何获取请求标头?

谢谢.

Kev*_*Cox 7

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

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();
}
Run Code Online (Sandbox Code Playgroud)