2010-11-05 87 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