【问题标题】:CGI POST method is not workingCGI POST 方法不起作用
【发布时间】:2015-04-27 06:52:03
【问题描述】:

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

apache2/access.log

[25/Feb/2015: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.0.2214.115 Safari/537.36"

apache2/error.log

[2015 年 2 月 25 日星期三 10:30:05.884648] [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;
}

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

【问题讨论】:

    标签: html c++ apache cgi


    【解决方案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 数据。

    【讨论】:

      【解决方案2】:

      一直没找到上面代码崩溃的原因,不过我终于用GNU Cgicc library实现了POST方法。

      【讨论】:

        猜你喜欢
        • 2023-04-04
        • 1970-01-01
        • 2018-08-23
        • 2015-03-19
        • 2012-05-31
        • 2019-01-07
        • 2018-01-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多