获取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 :: maphdrs; 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不会发送“接受”标头。