CGI POST 方法无效
CGI POST method is not working
我正在尝试 运行 我的第一个 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, like 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)Connection reset by peer: [client 127.0.0.1:54871] AH02550: Failed to flush CGI output to client
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;
}
有没有人知道出了什么问题?
我一直没找到为什么上面的代码会崩溃,但我终于用GNU Cgicc library.
实现了POST方法
当我没有读取传入的所有 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 数据。
我正在尝试 运行 我的第一个 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, like 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)Connection reset by peer: [client 127.0.0.1:54871] AH02550: Failed to flush CGI output to client
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;
}
有没有人知道出了什么问题?
我一直没找到为什么上面的代码会崩溃,但我终于用GNU Cgicc library.
实现了POST方法当我没有读取传入的所有 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 数据。