2010-11-05 84 views
6

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

我的问题:是否有可能让客户端发送所有头文件?

回答

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

4

Apache的mod_fcgi将所有客户端http头放在您传递到FCGX_Accept(服务器应用程序的主循环)的“FCGX_ParamArray”中。该类型仅仅是一个char **,其字符串的常用模式为“名称,值,名称...”。所以,你只需要像这样的循环,让他们都:

 
std::map&ltstd::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不会发送“接受”头文件。

+0

请注意:当且仅当该标题字段的整个字段值被定义为以逗号分隔的列表时,“消息中可能存在具有相同字段名的多个消息标题字段[即#(values )“。 (参见[RFC2616](http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.2))。因此你应该使用[std :: unordered_multimap](http://en.cppreference.com/w/cpp/container/unordered_multimap),作为[std :: map](http://en.cppreference.com/w/ cpp/container/map)键是唯一的。 – Phidelux 2017-09-19 14:48:29