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

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

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

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

 #include  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 。

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

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

 //“envp”是您传入FCGX_Accept(...)的FCGX_ParamArray 
 for(i = 0; envp [i]!= NULL; i + = 2){      
     name = envp [i];                    
     val = envp [i + 1];                                
     if(val!= NULL){                  
         hdrs [name] = string(val);      
     } 
    其他{
         hdrs [name] =“”;
     }                             
 }                                     

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

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

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