获取FastCGI中的所有客户端头文件(C / C ++)

时间:2010-11-05 13:48:08

标签: c++ c http fastcgi

目前我有点问题:
我想为nekoVM创建FastCGI / CGI绑定。这是通过编写VM加载的一些线索C / C ++代码来完成的。我想使我的绑定行为尽可能与neko native API(mod_neko,mod_tora)兼容。使用mod_neko,可以获取客户端发送的所有HTTP头 据我所知,只有通过调用getenv('header_name')才能通过FastCGI获取HTTP头。要使用此功能,您需要知道所有标题的名称。

我的问题:是否有可能获得客户端发送的所有标头?

2 个答案:

答案 0 :(得分:4)

Apache的mod_fcgi将所有客户端http头放在您传递给FCGX_Accept(服务器应用程序的主循环)的“FCGX_ParamArray”中。该类型只是一个char **,字符串的常用模式为“name,value,name,...”。所以,你只需要一个这样的循环就能得到它们:

std::map<std::string, std::string>  hdrs; 
std::string  name = 0;
char*        val  = 0;
int          i;

// "envp" is the FCGX_ParamArray you passed into FCGX_Accept(...) 
for(i=0; envp[i] != NULL; i+=2) {      
    name = envp[i];                    
    val  = envp[i+1];                                
    if(val != NULL) {                  
        hdrs[name] = string(val);      
    } 
    else {
        hdrs[name] = "";
    }                             
}                                     

如果您正在使用Apache并且想要访问所有静态配置(“httpd.conf”)设置,那么它们将被传递到main()的“arge”环境块中。

int main(int argc, char** argv, char** arge) {
    ....
}

请注意,并非所有客户端都会发送所有可能的标头 - 例如,CURL不会发送“接受”标头。

答案 1 :(得分:3)

您可以在大多数系统上使用外部定义的,以null结尾的environ变量来获取所有环境变量的数组,您可以迭代以获取所需的标头(假设FastCGI设置环境变量)以明智的方式):

#include <stdio.h>

int main(int argc, char *argv[])
{
    extern char **environ;
    for (int i = 0; environ[i] != NULL; i++)
    {
        printf("%s\n", environ[i]);
    }
}

请参阅man 7 environ