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

发布于 2024-09-30 18:15:06 字数 315 浏览 5 评论 0原文

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

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

currently I am struggeling with a little problem:
I want create FastCGI/CGI binding for the nekoVM. This is done by writing some clue C/C++ code that is loaded by the VM. I want to make the behaviour of my binding as compatible as possible with neko native API (mod_neko, mod_tora). With mod_neko it is possible to get all HTTP headers the client send.
As far as I know you can get HTTP headers with FastCGI only by calling getenv('header_name'). To use this function you need to know the name of all headers.

My question: Is there any possibility to get all headers the client send?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

无畏 2024-10-07 18:15:06

Apache 的 mod_fcgi 将所有客户端 http 标头放入您传递到 FCGX_Accept(服务器应用程序的主循环)的“FCGX_ParamArray”中。该类型只是一个 char**,字符串的常见模式为“名称、值、名称……”。因此,您只需要一个像这样的循环来获取所有这些:

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”)设置,它们将在“arge”环境块中传递main() 的。

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

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

Apache's mod_fcgi puts all client http headers in the "FCGX_ParamArray" that you passed into FCGX_Accept (the main loop of the server app). That type is just a char**, with the common pattern "name, value, name, ..." for the strings. So, you just need a loop like this to get them all:

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] = "";
    }                             
}                                     

If you're using Apache and want to access all the static config ("httpd.conf") settings as well, they're passed in the "arge" environment block of main().

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

Be aware that not all clients will send all possible headers- CURL, for example, does not send an "accept" header.

笔落惊风雨 2024-10-07 18:15:06

您可以在大多数系统上使用外部定义的、以 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

You can use the externally-defined, null-terminated environ variable on most systems to get an array of all environment variables, which you could iterate to grab the headers you need (assuming FastCGI sets up the environment variables in a sensible way):

#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]);
    }
}

See man 7 environ.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文