2

我正在为我的学校项目编写一个 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 环境变量(我正在这样做)并将请求正文发送到标准输入。我是否使用管道、dup2 并编写正确的方法来做到这一点?

发布到我的测试 PHP 脚本时,$_POST 数组为空。当发布到我的测试 perl 脚本时,它根本不会发送任何响应或完成运行;我认为它正在等待更多的标准输入。如果我的管道和 dup2ing 没有明显问题,我将发布一些可编译的测试代码来说明问题。

谢谢!

4

1 回答 1

0

管道和dup2ing都可以;我的问题是我的 CGI 环境变量。获胜的环境变量是 CONTENT_LENGTH,不以 HTTP_ 为前缀。

于 2013-02-05T20:55:17.410 回答