Получить все заголовки клиентов в 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".