[C/C++][CGIcc] GET работает, но POST приводит к сообщению об ошибке
Я новичок в CGI. Я использую Apache v2.2 и GNU cgicc v3.2.9. Я хочу использовать CGI для создания веб-страницы HTML с простой формой. Цель этой работы - позволить пользователю отправлять данные, нажимая кнопку на этом CGI непосредственно назад к "тому же" CGI. CGI оценивает данные и изменяет веб-страницу:
CGI -> CGI -> CGI -> ...
Я не могу использовать простую страницу HTML и отправлять запросы в cgi, потому что после этого я создал страницу CGI, где пользователь может снова отправить запрос в этот cgi, что приводит к той же ситуации, что и представленная:
HTML -> CGI -> CGI -> CGI -> ...
Использование метода формы POST приводит к сообщению об ошибке сервера во время работы GET:
access.log
[16 / Mar / 2011: 15: 00: 50] "GET /cgi-bin/cgiHandleEvents.cgi HTTP / 1.1" 200 973
[16 / Mar / 2011: 15: 00: 52] "GET /cgi-bin/cgiHandleEvents.cgi?value1=&value2=option1&value3=button1&value4=data4 HTTP / 1.1" 200 973
[16 / Mar / 2011: 15: 01: 34] "GET /cgi-bin/cgiHandleEvents.cgi HTTP / 1.1" 200 974
[16 / Mar / 2011: 15: 01: 37] "POST /cgi-bin/cgiHandleEvents.cgi HTTP / 1.1" 500 538
error.log (я уменьшил http: // до http // из-за предупреждения о спаме относительно моей репутации stackru)
[Ср. 16 марта 15:01:37 2011] [ошибка] [клиент 127.0.0.1] Преждевременное завершение заголовков скриптов: cgiHandleEvents.cgi, реферер: http//localhost/cgi-bin/cgiHandleEvents.cgi
[Ср. 16 марта 15:01:37 2011] [ошибка] [клиент 127.0.0.1] \r, реферер: http//localhost/cgi-bin/cgiHandleEvents.cgi
[Wed Mar 16 15:01:37 2011] [ошибка] [клиент 127.0.0.1] Это приложение запросило среду выполнения, чтобы завершить его необычным способом., Referer: http//localhost/cgi-bin/cgiHandleEvents.cgi
[Ср. 16 марта 15:01:37 2011] [ошибка] [клиент 127.0.0.1] Пожалуйста, обратитесь в службу поддержки приложения для получения дополнительной информации. \ R, реферер: http//localhost/cgi-bin/cgiHandleEvents.cgi
[Wed Mar 16 15:01:37 2011] [ошибка] [клиент 127.0.0.1] завершить вызов после выброса экземпляра 'std::runtime_error'\r, реферер: http//localhost/cgi-bin/cgiHandleEvents.cgi
[Wed Mar 16 15:01:37 2011] [error] [client 127.0.0.1] what (): ошибка ввода-вывода \ r, реферер: http//localhost/cgi-bin/cgiHandleEvents.cgi
Текущий код не содержит обработчик сообщений. По моему мнению на POST страница должна просто перезагрузиться. Для проверки кода вы можете поменять строки, содержащие другой метод формы.
#include "cgicc/CgiDefs.h"
#include "cgicc/Cgicc.h"
#include "cgicc/HTTPHTMLHeader.h"
#include "cgicc/HTMLClasses.h"
using namespace std;
using namespace cgicc;
int main()
{
Cgicc formData;
Cgicc cgi;
cout<< HTTPHTMLHeader() << endl;
cout<< HTMLDoctype(HTMLDoctype::eStrict) << endl;
cout<< html().set("lang", "EN").set("dir", "LTR") << endl;
// Set up the HTML document
cout<< html() << head() << title("Cgicc example") << head() << endl;
cout<< body().set("bgcolor","#cccccc").set("text","#000000").set("link","#0000ff").set("vlink","#000080") << endl;
try
{
cout<< h2("Test CGIcc form") << endl;
cout<< "GNU cgicc v" << cgi.getVersion() << "<BR>" << endl;
//cout<< "<form method=\"post\" action=\"cgiHandleEvents.cgi\">"<< endl;
cout<< "<form method=\"get\" action=\"cgiHandleEvents.cgi\">"<< endl;
cout<< " Value 1:" << endl;
cout<< " <input type=\"text\" name=\"value1\">" << endl;
cout<< " <p></p>" << endl;
cout<< " Value 2:" << endl;
cout<< " <select name=\"value2\">" << endl;
cout<< " <option value=\"option1\">Option 1" << endl;
cout<< " <option value=\"option2\">Option 2" << endl;
cout<< " <option value=\"option3\">Option 3" << endl;
cout<< " </select>" << endl;
cout<< " <p></p>" << endl;
cout<< " Value 3:" << endl;
cout<< " <input type=\"radio\" name=\"value3\" value=\"button1\" checked=\"checked\">Button1" << endl;
cout<< " <input type=\"radio\" name=\"value3\" value=\"button2\">Button2" << endl;
cout<< " <input type=\"hidden\" name=\"value4\" value=\"data4\">" << endl;
cout<< " <p></p>" << endl;
cout<< " <input type=\"submit\" value=\"Submit\">" << endl;
cout<< "</form>" << endl;
}
catch(exception& e)
{
// handle any errors here.
cout<< h2("ERROR!!!") << endl;
}
// Close the HTML document
cout << body() << html();
return 0; // To avoid Apache errors.
}
Кто-нибудь знает, в чем проблема?
2 ответа
Я нашел ошибки. Первая ошибка - это неправильный HTML. Обратите внимание на открывающий и закрывающий тег для html, не охватывающий всю html-страницу!
cout<< html().set("lang", "EN").set("dir", "LTR") << endl;
// Set up the HTML document
cout<< html() << head() << title("Cgicc example") << head() << endl;
Вторая ошибка, кажется,
Cgicc formData;
Я не знаю, почему это приводит к ошибке. Но если я не использую его, запрос POST работает нормально. Если я думаю дважды, не имеет смысла иметь 2 экземпляра Cgicc. Это моя ошибка. м (
Но я думаю, что это ошибка внутри cgicc. Я сообщу об ошибке в саванне...
Я знаю, что это очень поздний ответ, но, может быть, он кому-то поможет.
Вчера я впервые начал работать со скриптами C++ Cgi. Я обнаружил, что объявление Cgicc несколько раз в коде при отправке данных методом POST (GET работает нормально) также вызвало ту же проблему для меня. Это было решено путем объявления Cgicc глобально, и, таким образом, только один раз в коде.