Я пишу http-сервер для своего школьного проекта и пытаюсь выполнить скрипт CGI. Следующий код успешно выполняет программу cgi, и выходные данные программы отправляются в браузер, но что-то не так с тем, как я отправляю POST-данные. Вот что у меня есть:
int p[2];
pipe(p);
int pid = fork();
if (pid == 0) {
close(p[1]);
dup2(p[0], STDIN_FILENO);
dup2(socket, STDOUT_FILENO);
execve(path.c_str(), {}, (char**) &env[0]);
} else {
close(p[0]);
string body = req->getBody();
write(p[1], body.c_str(), body.size());
close(socket);
}
Если я правильно понимаю CGI, мне просто нужно установить переменную среды HTTP_CONTENT_LENGTH (что я делаю) и отправить тело запроса в stdin. Я использую pipe, dup2 и напишу правильный способ сделать это?
При публикации в моем тестовом PHP-скрипте массив $ _POST пуст. При публикации в мой тестовый сценарий Perl он просто никогда не отправляет ответ и не завершает работу; Я предполагаю, что это ждет больше стандартного. Если с моим конвейером и dup2ing нет ничего явно плохого, я выложу некоторый скомпилированный тестовый код, который иллюстрирует проблему.
Спасибо!
Трубопровод и dup2ing все в порядке; моей проблемой была моя переменная окружения CGI. Переменная среда-победитель — CONTENT_LENGTH, без префикса HTTP_.
Других решений пока нет …