2010-11-05 18 views
6

Attualmente sto lottando con un piccolo problema:
Voglio creare il binding FastCGI/CGI per lo nekoVM. Questo viene fatto scrivendo un codice Cue C++ che viene caricato dalla VM. Voglio rendere il comportamento del mio binding il più compatibile possibile con l'API neko native (mod_neko, mod_tora). Con mod_neko è possibile ottenere tutte le intestazioni HTTP inviate dal client.
Per quanto ne so, è possibile ottenere intestazioni HTTP con FastCGI solo chiamando getenv('header_name'). Per utilizzare questa funzione è necessario conoscere il nome di tutte le intestazioni.Ottieni tutte le intestazioni client in FastCGI (C/C++)

La mia domanda: C'è qualche possibilità di ottenere tutte le intestazioni inviate dal client?

risposta

3

È possibile utilizzare l'esternamente definito, terminazione Null environ variabile su molti sistemi per ottenere un array di tutte le variabili d'ambiente, che si potrebbe iterare per afferrare le intestazioni necessarie (supponendo FastCGI imposta le variabili di ambiente in un ragionevole modo):

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

Vedere man 7 environ.

4

mod_fcgi di Apache inserisce tutte le intestazioni http del client nel "FCGX_ParamArray" passato in FCGX_Accept (il ciclo principale dell'app del server). Quel tipo è solo un char **, con lo schema comune "nome, valore, nome, ..." per le stringhe. Quindi, è sufficiente un ciclo come questo per farli tutti:

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

Se si utilizza Apache e si desidera accedere a tutte le config statico ("httpd.conf") impostazioni come bene, sono passati nel blocco di ambiente "arge" di main().

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

essere consapevoli del fatto che non tutti i client invieranno tutte le possibili CURL headers-, per esempio, non invia un header "accetta".

+0

Attenzione che "Più campi di intestazione messaggio con lo stesso nome-campo POSSONO essere presenti in un messaggio se e solo se l'intero campo-valore per quel campo di intestazione è definito come un elenco separato da virgole [cioè, # (valori)]." (vedi [RFC2616] (http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.2)). Quindi dovresti usare [std :: unordered_multimap] (http://en.cppreference.com/w/cpp/container/unordered_multimap), come [std :: map] (http://en.cppreference.com/w/ le chiavi cpp/container/map) sono uniche. – Phidelux

Problemi correlati