Получить все заголовки клиентов в FastCGI (C / C ++) - PullRequest
6 голосов
/ 05 ноября 2010

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

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

Ответы [ 2 ]

4 голосов
/ 25 мая 2011

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

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".

3 голосов
/ 05 ноября 2010

Вы можете использовать внешнюю переменную 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, окружающий .

...