2010-11-05 5 views
6

में सभी क्लाइंट हेडर प्राप्त करें वर्तमान में मैं थोड़ी सी समस्या के साथ स्ट्रक्चरिंग कर रहा हूं:
मैं nekoVM के लिए फास्टसीजीआई/सीजीआई बाध्यकारी बनाना चाहता हूं। यह कुछ सुराग सी/सी ++ कोड लिखकर किया जाता है जो वीएम द्वारा लोड किया जाता है। मैं अपने बाध्यकारी के व्यवहार को neko देशी एपीआई (mod_neko, mod_tora) के साथ जितना संभव हो सके संगत बनाना चाहता हूं। Mod_neko के साथ क्लाइंट भेजने वाले सभी HTTP शीर्षलेख प्राप्त करना संभव है।
जहां तक ​​मुझे पता है कि आप केवल getenv('header_name') पर कॉल करके फास्टसीजीआई के साथ HTTP शीर्षलेख प्राप्त कर सकते हैं। इस फ़ंक्शन का उपयोग करने के लिए आपको सभी शीर्षकों का नाम जानना होगा।फास्टसीजीआई (सी/सी ++)

मेरा प्रश्न: क्या ग्राहक द्वारा भेजे गए सभी शीर्षकों को प्राप्त करने की कोई संभावना है?

उत्तर

3

आप सभी पर्यावरण चरों की एक सरणी प्राप्त करने के लिए बाहरी रूप से परिभाषित, शून्य-समाप्त environ चर का उपयोग कर सकते हैं, जिसे आप आवश्यक शीर्षकों को पकड़ने के लिए पुन: प्रयास कर सकते हैं (माना जाता है कि फास्टसीजीआई एक समझदार में पर्यावरण चर सेट करता है जिस तरह से):

#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

अपाचे का mod_fcgi सभी क्लाइंट http शीर्षलेखों को "FCGX_ParamArray" में डालता है जिसे आपने FCGX_Accept (सर्वर ऐप का मुख्य लूप) में पारित किया है। स्ट्रिंग के लिए सामान्य पैटर्न "नाम, मूल्य, नाम, ..." के साथ, यह प्रकार सिर्फ एक 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] = ""; 
    }        
}          

आप अपाचे का उपयोग कर और सभी स्थिर config ("httpd.conf") का उपयोग करने के साथ ही चाहते हैं सेटिंग्स रहे हैं तो उन्हें पारित कर रहे हैं: तो, तुम सिर्फ उन सब को प्राप्त करने के लिए इस तरह एक पाश की जरूरत है मुख्य() के "arge" पर्यावरण ब्लॉक में।

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

, ध्यान रखें कि सभी ग्राहकों के लिए सभी संभव headers- कर्ल भेज देंगे बनें उदाहरण के लिए, एक "स्वीकार" शीर्षक नहीं भेजता है।

+0

सावधान रहें कि "एक ही फ़ील्ड-नाम वाले एकाधिक संदेश-शीर्षक फ़ील्ड किसी संदेश में मौजूद हो सकते हैं यदि केवल और उस हेडर फ़ील्ड के लिए संपूर्ण फ़ील्ड-मान को अल्पविराम से अलग सूची के रूप में परिभाषित किया गया है [यानी, # (मान)]। " (देखें [आरएफसी 2616] (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/ सीपीपी/कंटेनर/मानचित्र) कुंजी अद्वितीय हैं। – Phidelux

संबंधित मुद्दे