Получить все заголовки клиентов в FastCGI (C / C++)

в настоящее время я борюсь с небольшой проблемой:
Я хочу создать привязку FastCGI/CGI для nekoVM. Это делается путем написания некоторого кода clue C / C++, загружаемого виртуальной машиной. Я хочу сделать поведение моей привязки максимально совместимым с Neko native API (mod_neko, mod_tora). С mod_neko можно получить все HTTP-заголовки клиенту отправить.
Насколько я знаю, вы можете получить HTTP-заголовки с FastCGI только путем вызова getenv('header_name'). Чтобы использовать эту функцию вам нужно знать название всех заголовков.

мой вопрос: есть ли возможность получить все заголовки клиента послать?

2 ответов


вы можете использовать внешне определенный, null-terminated 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]);
    }
}

посмотреть человек 7 environ.


Apache mod_fcgi помещает все клиентские HTTP-заголовки в" FCGX_ParamArray", который вы передали в FCGX_Accept (основной цикл серверного приложения). Этот тип является просто char**, с общим шаблоном " имя, значение, имя,...- для струн. Итак, вам просто нужен такой цикл, чтобы получить их все:

std::map&ltstd::string, std::string&gt  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" ) также передаются в блоке среды" arge " main().

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

имейте в виду, что не все клиенты будут отправлять все возможные заголовки - CURL, например, не отправляет заголовок "accept".