CGI POST方法不起作用

CGI POST method is not working

本文关键字:不起作用 方法 POST CGI      更新时间:2023-10-16

我正在尝试运行我的第一个C++CGI应用程序。我使用Ubuntu 14.04和Apache 2.4.7。GET方法运行良好,问题是当我尝试从html表单执行POST方法时,浏览器没有得到响应。日志文件如下所示:

apache2/access.log

【2015年2月25日:10:30:05+0100】"POST/cgi-bin/cgi-test.cgi HTTP/1.1"200 0"-"Mozilla/5.0(X11;Linux x86_64)AppleWebKit/537.36(KHTML,类似Gecko)Chrome/40.2214.115 Safari/537.36"

apache2/error.log

〔2月25日星期三10:30:05.884648 2015〕〔cgid:error〕〔pid 1158:tid 139962890278656〕(104)对等方重置连接:〔client 127.0.0.1:54871〕AH02550:无法将CGI输出刷新到客户端

POST表单代码:

<form action="http://localhost/cgi-bin/cgi-test.cgi" method="post">
Test image: <input type="text" name="test">  <br />
<input type="submit" value="Submit" />
</form>

GET表单代码:

<form action="http://localhost/cgi-bin/cgi-test.cgi" method="get">
Test image: <input type="text" name="test">  <br />
<input type="submit" value="Submit" />
</form>

和C++代码:

#include <iostream>
#include <stdlib.h>
#include <stdio.h>
int main()
{
    std::cout << "Content-type: text/plainnn";
    char* get_query_data = getenv("QUERY_STRING");
    int l_result = -1;
    char* lenstr = getenv("CONTENT_LENGTH");
    if ( lenstr != NULL )
    {
        l_result = atoi(lenstr);
    }
    std::cout << "Post read length: " << l_result <<std::endl;
}

有人知道出了什么问题吗?

我在没有读取传入的所有POST数据时遇到过这种情况。Apache重复使用相同的缓冲区向CGI脚本发送数据和从CGI脚本接收数据。因此,当Apache读取您发送回的响应时

("内容类型:text/plain\n\n后读长度:"),

POST数据的一部分仍在缓冲区中

("内容类型:text/plane\n\n读取后长度测试=asdfjwkeqwersk598rsdf")。

Apache检测到响应格式错误,因此无法刷新输出并关闭连接。

总之,从std::cin中读取所有POST数据。

我从未发现上面的代码崩溃的原因,但我最终使用GNU Cgicc库实现了POST方法。