【问题标题】:Get all client headers in FastCGI (C/C++)获取 FastCGI (C/C++) 中的所有客户端标头
【发布时间】:2010-11-05 13:48:07
【问题描述】:

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

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

【问题讨论】:

    标签: c++ c http fastcgi


    【解决方案1】:

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

    std::map&ltstd::string, std::string&gt hdrs; 标准::字符串名称 = 0; 字符* val = 0; 诠释我; // "envp" 是你传入 FCGX_Accept(...) 的 FCGX_ParamArray for(i=0; envp[i] != NULL; i+=2) { 名称 = 环境 [i]; val = envp[i+1]; 如果(验证!= NULL){ hdrs[名称] = 字符串(val); } 别的 { hdrs[名称] = ""; } }

    如果您使用的是 Apache 并且还想访问所有静态配置(“httpd.conf”)设置,则它们会在 main() 的“arge”环境块中传递。

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

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

    【讨论】:

    • 请注意“当且仅当该标头字段的整个字段值被定义为逗号分隔的列表 [即,#(值)]。” (见RFC2616)。因此您应该使用std::unordered_multimap,因为std::map 键是唯一的。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-24
      • 2013-09-22
      • 2011-10-19
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      • 2022-06-14
      • 1970-01-01
      相关资源
      最近更新 更多