CGI POST方法不起作用

时间:2015-02-25 10:14:19

标签: html c++ apache cgi

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

的apache2 / access.log的

  

[25 / Feb / 2015:10:3​​0: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.0.2214.115 Safari / 537.36“

的apache2 / error.log中

  

[Wed Feb 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/plain\n\n";

    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;
}

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

2 个答案:

答案 0 :(得分:1)

当我没有读取传入的所有POST数据时,我发生了这种情况.Apache重用相同的缓冲区将数据发送到CGI脚本并从CGI脚本接收。因此,当Apache读取您发回的响应时

(“Content-type:text / plain \ n \ nPost read length:”),

部分POST数据仍然在缓冲区中

(“Content-type:text / plain \ n \ nPost read length test = asdfjwkeqwersk598rsdf”)。

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

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

答案 1 :(得分:0)

我从未发现为什么上面的代码崩溃,但我最终使用GNU Cgicc library实现了POST方法。