[C / C ++] [CGIcc] GET работает, но POST приводит к сообщению об ошибке - PullRequest
0 голосов
/ 16 марта 2011

Я новичок в 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

ошибка.log (я уменьшил http: // до http // из-за предупреждения о спаме относительно моих стековрепутация erflow)

[ср. 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

[Ср. 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

[ср. 16 марта 15:01:37 2011] [ошибка] [клиент 127.0.0.1] завершить вызов после выброса экземпляра 'std :: runtime_error' \r, реферер: http // localhost / cgi-bin / cgiHandleEvents.cgi

[ср. 16 марта 15:01:37 2011] [ошибка] [клиент 127.0.0.1] what (): ошибка ввода-выводаг, реferer: 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 ]

2 голосов
/ 04 июля 2013

Я знаю, что это очень поздний ответ, но, может быть, он кому-нибудь поможет.

Вчера я впервые начал работать со скриптами C ++ Cgi.Я обнаружил, что объявление Cgicc несколько раз в коде при отправке данных методом POST (GET работает нормально) также вызвало ту же проблему для меня.Это было решено путем объявления Cgicc глобально, и, таким образом, только один раз в коде.

0 голосов
/ 18 марта 2011

Я нашел ошибки.Первая ошибка - это неправильный 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.Это моя ошибка.m (

Но я думаю, что это ошибка внутри cgicc. Я сообщу об ошибке в саванне ...

...