Получить все заголовки клиентов в 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<std::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] = ""; } }
Если вы используете Apache и хотите получить доступ ко всем статическим конфигурациям ("httpd.настройки conf" ) также передаются в блоке среды" arge " main().
int main(int argc, char** argv, char** arge) { .... }
имейте в виду, что не все клиенты будут отправлять все возможные заголовки - CURL, например, не отправляет заголовок "accept".