2010-11-05 16 views
6

Actualmente estoy luchando con un pequeño problema:
Quiero crear enlaces FastCGI/CGI para el nekoVM. Esto se hace escribiendo algún código de clave C/C++ que cargue la máquina virtual. Quiero hacer que el comportamiento de mi enlace sea lo más compatible posible con la API nativa de neko (mod_neko, mod_tora). Con mod_neko es posible obtener todos los encabezados HTTP que envía el cliente. Por lo que yo sé, puede obtener encabezados HTTP con FastCGI llamando al getenv('header_name'). Para usar esta función necesita saber el nombre de todos los encabezados.Obtener todos los encabezados de clientes en FastCGI (C/C++)

Mi pregunta: ¿Hay alguna posibilidad de obtener todos los encabezados que envía el cliente?

Respuesta

3

Puede usar la variable environ definida externamente y terminada en nulo en la mayoría de los sistemas para obtener una matriz de todas las variables de entorno, que puede repetir para obtener los encabezados que necesita (suponiendo FastCGI configura las variables de entorno en un manera):

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

Ver man 7 environ.

4

Apache mod_fcgi pone todos los encabezados http de clientes en el "FCGX_ParamArray" que pasó a FCGX_Accept (el bucle principal de la aplicación de servidor). Ese tipo es solo un char **, con el patrón común "nombre, valor, nombre, ..." para las cadenas. Por lo tanto, sólo tiene un bucle como este para llegar a todos ellos:

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

Si estás usando Apache y desea acceder a toda la configuración estática ("httpd.conf") los ajustes, así, son pasaron en el bloque de entorno "arge" de main().

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

Tenga en cuenta que no todos los clientes van a enviar toda posible CURL headers-, por ejemplo, no envía una "aceptar" de cabecera.

+0

Tenga en cuenta que "Múltiples campos de encabezado de mensaje con el mismo nombre de campo PUEDEN estar presentes en un mensaje si y solo si el campo completo de ese campo de encabezado está definido como una lista separada por comas [es decir, # (valores)] ". (Ver [RFC2616] (http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.2)). Por lo tanto, debe usar [std :: unordered_multimap] (http://en.cppreference.com/w/cpp/container/unordered_multimap), como [std :: map] (http://en.cppreference.com/w/ cpp/contenedor/mapa) son únicas. – Phidelux

Cuestiones relacionadas