[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 глобально, и, таким образом, только один раз в коде.

Другие вопросы по тегам