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