756 lines
27 KiB
C++
756 lines
27 KiB
C++
|
#if 0
|
||
|
|
||
|
#include <exception>
|
||
|
#include <iostream>
|
||
|
|
||
|
#include <stdlib.h>
|
||
|
// for the getenv call
|
||
|
#include <sys/sysinfo.h> // for the system uptime call
|
||
|
|
||
|
#include <cgicc/Cgicc.h> // the cgicc headers
|
||
|
#include <cgicc/CgiDefs.h>
|
||
|
#include <cgicc/HTTPHTMLHeader.h>
|
||
|
#include <cgicc/HTMLClasses.h>
|
||
|
|
||
|
#include "LED.h"
|
||
|
|
||
|
using namespace std;
|
||
|
using namespace cgicc;
|
||
|
|
||
|
#if 0
|
||
|
int main(int argc, char** argv)
|
||
|
{
|
||
|
try
|
||
|
{
|
||
|
Cgicc cgi;
|
||
|
|
||
|
// Output the HTTP headers for an HTML document, and the HTML 4.0 DTD info
|
||
|
cout << HTTPHTMLHeader() << HTMLDoctype(HTMLDoctype::eStrict) << endl;
|
||
|
cout << html().set("lang", "en").set("dir", "ltr") << endl;
|
||
|
|
||
|
// Set up the page's header and title.
|
||
|
cout << head() << endl;
|
||
|
cout << title() << "GNU cgicc v" << cgi.getVersion() << title() << endl;
|
||
|
cout << head() << endl;
|
||
|
|
||
|
// Start the HTML body
|
||
|
cout << body() << endl;
|
||
|
|
||
|
// Print out a message
|
||
|
cout << h1("Hello, world from GNU cgicc") << endl;
|
||
|
|
||
|
// Close the document
|
||
|
cout << body() << html();
|
||
|
}
|
||
|
|
||
|
catch( const exception& e )
|
||
|
{
|
||
|
// handle error condition
|
||
|
}
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
|
||
|
//cgicc GET example
|
||
|
// http://192.168.3.89/api/cgiexam?command=off
|
||
|
//
|
||
|
|
||
|
#if 0
|
||
|
int main()
|
||
|
{
|
||
|
Cgicc form; // The Cgicc object
|
||
|
LED* led3 = new LED(3); // The LED object -- USR3
|
||
|
|
||
|
// Generate the response HTML page
|
||
|
char* value = getenv("REMOTE_ADDR"); // the remote address CGI env. variable
|
||
|
cout << "Content-type:text/html\r\n\r\n"; // generate the HTML output
|
||
|
cout << "<html><head>\n";
|
||
|
cout << "<title>EBB C++ GET Example</title>\n";
|
||
|
cout << "</head><body>\n";
|
||
|
cout << "<h1>BeagleBone GET Example</h1>\n";
|
||
|
|
||
|
form_iterator it = form.getElement("command"); // read the URL get command string
|
||
|
if( it == form.getElements().end() || it->getValue() == "" )
|
||
|
{
|
||
|
cout << "<div> The LED command is missing or invalid.</div>";
|
||
|
cout << "<div> Valid commands are on, off, flash, and status </div>";
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
string cmd(**it);
|
||
|
cout << "<div> The LED command is " << cmd << ".</div>";
|
||
|
/** This code sets the USR3 LED state using the LED class **/
|
||
|
if( cmd == "on" ) led3->turnOn();
|
||
|
else if( cmd == "off" ) led3->turnOff();
|
||
|
else if( cmd == "flash" ) led3->flash("100");
|
||
|
else if( cmd == "status" )
|
||
|
{
|
||
|
cout << "<div>";
|
||
|
led3->outputState();
|
||
|
cout << "</div>";
|
||
|
}
|
||
|
else cout << "<div> Invalid command! </div>";
|
||
|
}
|
||
|
cout << "<div> The CGI REMOTE_ADDR environment variable is " << value << "</div>";
|
||
|
cout << "</body></html>\n";
|
||
|
return 0;
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
//cigcc POST example
|
||
|
#if 0
|
||
|
|
||
|
int main()
|
||
|
{
|
||
|
Cgicc form; // the CGI form object
|
||
|
LED* led3 = new LED(3); // the LED object -- USR3
|
||
|
string flashPeriod, command; // default values
|
||
|
|
||
|
bool isStatus = form.queryCheckbox("status"); // get the state of the status checkbox
|
||
|
form_iterator it = form.getElement("period"); // get the period text value
|
||
|
if( it == form.getElements().end() || it->getValue() == "" )
|
||
|
{
|
||
|
flashPeriod = "100"; // if it is invalid use 100
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
flashPeriod = it->getValue();
|
||
|
} // otherwise use submitted value
|
||
|
|
||
|
it = form.getElement("command"); // get the radio command chosen
|
||
|
|
||
|
if( it == form.getElements().end() || it->getValue() == "" )
|
||
|
{
|
||
|
command = "off"; // if it is invalid use "off"
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
command = it->getValue();
|
||
|
} // otherwise use submitted value
|
||
|
|
||
|
char* value = getenv("REMOTE_ADDR"); // The remote address CGI env. variable
|
||
|
|
||
|
std::string post_url = "/api/cgiexam";
|
||
|
|
||
|
// Generate the form but use states that are set in the form that was submitted
|
||
|
cout << HTTPHTMLHeader() << endl; // Generate the HTML form using cgicc
|
||
|
cout << html() << head() << title("EBB C++ Post LED Example") << head() << endl;
|
||
|
cout << body() << h1("BeagleBone POST LED Example") << endl;;
|
||
|
|
||
|
//cout << "<form action=\"/cgi-bin/postLED.cgi\" method=\"POST\">\n";
|
||
|
cout << "<form action=\"" << post_url.c_str() << "\" method=\"POST\">\n";
|
||
|
|
||
|
cout << "<div>LED state: <input type=\"radio\" name=\"command\" value=\"on\""
|
||
|
<< (command == "on" ? "checked" : "") << "/> On "; // is the command="on"?
|
||
|
cout << "<input type=\"radio\" name=\"command\" value=\"off\""
|
||
|
<< (command == "off" ? "checked" : "") << "/> Off ";
|
||
|
cout << "<input type=\"radio\" name=\"command\" value=\"flash\""
|
||
|
<< (command == "flash" ? "checked" : "") << "/> Flash ";
|
||
|
cout << "<input type=\"checkbox\" name=\"status\" " << (isStatus ? "checked" : "")
|
||
|
<< " /> Display Status </div>";
|
||
|
cout << "<div>Flash period: <input type=\"text\" name=\"period\" size=\"6\" value=\""
|
||
|
<< flashPeriod << "\"> ms "; // populate the text field
|
||
|
cout << "<input type=\"submit\" value=\"Execute Command\" />";
|
||
|
cout << "</div></form>";
|
||
|
|
||
|
// Process the form data to trigger the LED state
|
||
|
if( command == "on" )
|
||
|
led3->turnOn(); // turn the LED on?
|
||
|
else if( command == "off" )
|
||
|
led3->turnOff(); // off?
|
||
|
else if( command == "flash" )
|
||
|
led3->flash(flashPeriod); // flash with the period above
|
||
|
else
|
||
|
cout << "<div> Invalid command! </div>"; // not possible at the moment
|
||
|
|
||
|
// If the Display Status checkbox is checked then display the status now
|
||
|
// this should happen after the command is set, otherwise it is old data
|
||
|
if( isStatus )
|
||
|
{
|
||
|
cout << "<div>";
|
||
|
led3->outputState();
|
||
|
cout << "</div>";
|
||
|
}
|
||
|
|
||
|
cout << "<div> The CGI REMOTE_ADDR environment variable is " << value << "</div>";
|
||
|
cout << body() << html();
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
|
||
|
#endif
|
||
|
|
||
|
#endif
|
||
|
|
||
|
/* -*-mode:c++; c-file-style: "gnu";-*- */
|
||
|
/*
|
||
|
* $Id: test.cpp,v 1.27 2007/07/08 20:06:59 sebdiaz Exp $
|
||
|
*
|
||
|
* Copyright (C) 1996 - 2004 Stephen F. Booth <sbooth@gnu.org>
|
||
|
* 2007 Sebastien DIAZ <sebastien.diaz@gmail.com>
|
||
|
* Part of the GNU cgicc library, http://www.gnu.org/software/cgicc
|
||
|
*
|
||
|
* This library is free software; you can redistribute it and/or
|
||
|
* modify it under the terms of the GNU Lesser General Public
|
||
|
* License as published by the Free Software Foundation; either
|
||
|
* version 3 of the License, or (at your option) any later version.
|
||
|
*
|
||
|
* This library is distributed in the hope that it will be useful,
|
||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||
|
* Lesser General Public License for more details.
|
||
|
*
|
||
|
* You should have received a copy of the GNU Lesser General Public
|
||
|
* License along with this library; if not, write to the Free Software
|
||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
|
||
|
*/
|
||
|
|
||
|
/*! \file test.cpp
|
||
|
* \brief GNU %cgicc test application
|
||
|
*
|
||
|
* Tests and demonstrates access of form data using the GNU %cgicc library.
|
||
|
*/
|
||
|
|
||
|
#include <new>
|
||
|
#include <string>
|
||
|
#include <vector>
|
||
|
#include <stdexcept>
|
||
|
#include <iostream>
|
||
|
#include <cstdlib>
|
||
|
|
||
|
#include "cgicc/CgiDefs.h"
|
||
|
#include "cgicc/Cgicc.h"
|
||
|
#include "cgicc/HTTPHTMLHeader.h"
|
||
|
#include "cgicc/HTMLClasses.h"
|
||
|
|
||
|
#if HAVE_SYS_UTSNAME_H
|
||
|
# include <sys/utsname.h>
|
||
|
#endif
|
||
|
|
||
|
#if HAVE_SYS_TIME_H
|
||
|
# include <sys/time.h>
|
||
|
#endif
|
||
|
|
||
|
using namespace std;
|
||
|
using namespace cgicc;
|
||
|
|
||
|
// Function prototypes
|
||
|
void dumpEnvironment(const CgiEnvironment& env);
|
||
|
void dumpList(const Cgicc& formData);
|
||
|
void showForm(const Cgicc& formData);
|
||
|
|
||
|
const std::string styles =
|
||
|
"body { color: black; background: white; }\n"
|
||
|
"span.red { color:red; }\n"
|
||
|
"hr.half { width: 60%; margin-left: auto; margin-right: auto; }\n"
|
||
|
"div.center { text-align: center; }\n"
|
||
|
"div.notice { border: solid thin; padding: 1em; margin: 1em 0; "
|
||
|
"background: #ddd; text-align: center; }"
|
||
|
"table { width: 90%; margin-left: auto; margin-right: auto; }\n"
|
||
|
"tr.title, td.title { color: white; background: black; font-weight: bold; "
|
||
|
"text-align: center; }\n"
|
||
|
"tr.data, td.data { background: #ddd; }\n"
|
||
|
"td.form { background: #ddd; text-align: center; }\n"
|
||
|
;
|
||
|
|
||
|
// Print the form for this CGI
|
||
|
void printForm(const Cgicc& cgi)
|
||
|
{
|
||
|
cout << "<form method=\"post\" action=\""
|
||
|
<< cgi.getEnvironment().getScriptName() << "\">" << endl;
|
||
|
|
||
|
cout << "<table>" << endl;
|
||
|
|
||
|
cout << "<tr><td class=\"title\">Your name</td>"
|
||
|
<< "<td class=\"form\">"
|
||
|
<< "<input type=\"text\" name=\"name\" value=\"Uncle Bob\" />"
|
||
|
<< "</td></tr>" << endl;
|
||
|
|
||
|
cout << "<tr><td class=\"title\">Your salary in millions<br />(80-120)</td>"
|
||
|
<< "<td class=\"form\">"
|
||
|
<< "<input type=\"text\" name=\"bucks\" value=\"93\" />"
|
||
|
<< "</td></tr>" << endl;
|
||
|
|
||
|
cout << "<tr><td class=\"title\">Hours you've wasted on the web</td>"
|
||
|
<< "<td class=\"form\">"
|
||
|
<< "<input type=\"text\" name=\"time\" value=\"100\" />"
|
||
|
<< "</td></tr>" << endl;
|
||
|
|
||
|
cout << "<tr><td class=\"title\">Your thoughts (on anything)</td>"
|
||
|
<< "<td class=\"form\">"
|
||
|
<< "<textarea name=\"thoughts\" rows=\"4\" cols=\"40\">"
|
||
|
<< "I don't have any!</textarea>" << "</td></tr>" << endl;
|
||
|
|
||
|
cout << "<tr><td class=\"title\">Are you hungry?</td>"
|
||
|
<< "<td class=\"form\">"
|
||
|
<< "<input type=\"checkbox\" name=\"hungry\" checked=\"checked\" />"
|
||
|
<< "Yes</td></tr>" << endl;
|
||
|
|
||
|
cout << "<tr><td class=\"title\">Your favorite flavors of ice cream</td>"
|
||
|
<< "<td class=\"form\">"
|
||
|
<< "<select name=\"flavors\" multiple=\"multiple\">"
|
||
|
<< "<option value=\"cookie dough\">Cookie Dough</option>"
|
||
|
<< "<option value=\"rocky road\">Rocky Road</option>"
|
||
|
<< "<option value=\"chocolate\">Chocolate</option>"
|
||
|
<< "<option value=\"strawberry\">Strawberry</option>"
|
||
|
<< "<option value=\"vanilla\">Vanilla</option>"
|
||
|
<< "</select>" << "</td></tr>" << endl;
|
||
|
|
||
|
cout << "<tr><td class=\"title\">Your hair color</td>"
|
||
|
<< "<td class=\"form\">"
|
||
|
<< "<select name=\"hair\">"
|
||
|
<< "<option value=\"blond\">Blond</option>"
|
||
|
<< "<option value=\"brown\">Brown</option>"
|
||
|
<< "<option value=\"red\">Red</option>"
|
||
|
<< "<option value=\"black\">Black</option>"
|
||
|
<< "<option value=\"white\">White</option>"
|
||
|
<< "<option value=\"green\">Green</option>"
|
||
|
<< "<option value=\"multicolored\">Multicolored</option>"
|
||
|
<< "</select>" << "</td></tr>" << endl;
|
||
|
|
||
|
cout << "<tr><td class=\"title\">Your web browser</td>"
|
||
|
<< "<td class=\"form\">"
|
||
|
<< "<input type=\"radio\" name=\"browser\" value=\"Konqueror\""
|
||
|
<< " checked=\"checked\" />Konqeuror"
|
||
|
<< "<input type=\"radio\" name=\"browser\" value=\"Lynx\" />Lynx"
|
||
|
<< "<input type=\"radio\" name=\"browser\" value=\"Mozilla\" />Mozilla"
|
||
|
<< "<input type=\"radio\" name=\"browser\" value=\"IE\" />IE"
|
||
|
<< "<input type=\"radio\" name=\"browser\" value=\"Other\" />Other"
|
||
|
<< "</td></tr>" << endl;
|
||
|
|
||
|
cout << "<tr><td class=\"title\">Your favorite authors</td>"
|
||
|
<< "<td class=\"form\">"
|
||
|
<< "<input type=\"checkbox\" name=\"authors\" value=\"O'Brian\" />"
|
||
|
<< "O'Brian"
|
||
|
<< "<input type=\"checkbox\" name=\"authors\" value=\"Feynman\" />"
|
||
|
<< "Feynman"
|
||
|
<< "<input type=\"checkbox\" name=\"authors\" value=\"Camus\" />Camus"
|
||
|
<< "<input type=\"checkbox\" name=\"authors\" value=\"Conrad\" />Conrad"
|
||
|
<< "<input type=\"checkbox\" name=\"authors\" value=\"Vergil\" />Vergil"
|
||
|
<< "<input type=\"checkbox\" name=\"authors\" value=\"Plato\" />Plato"
|
||
|
<< "</td></tr>" << endl;
|
||
|
|
||
|
cout << "<tr><td class=\"title\">In the output, show</td>"
|
||
|
<< "<td class=\"form\">"
|
||
|
<< "<input type=\"checkbox\" name=\"showEnv\" checked=\"checked\" />"
|
||
|
<< "Data from CgiEnvironment<br />"
|
||
|
<< "<input type=\"checkbox\" name=\"showFE\" checked=\"checked\" />"
|
||
|
<< "All FormEntries<br />"
|
||
|
<< "<input type=\"checkbox\" name=\"showForm\" checked=\"checked\" />"
|
||
|
<< "Data from Cgicc"
|
||
|
<< "</td></tr>" << endl;
|
||
|
|
||
|
cout << "<tr><td class=\"title\">Exception Handling</td>"
|
||
|
<< "<td class=\"form\">"
|
||
|
<< "<input type=\"checkbox\" name=\"throw\" />"
|
||
|
<< "Throw an exception to test error handling"
|
||
|
<< "</td></tr>" << endl;
|
||
|
|
||
|
cout << "<tr><td class=\"title\">Save and Restore</td>"
|
||
|
<< "<td class=\"form\">"
|
||
|
<< "<input type=\"checkbox\" name=\"save\" />"
|
||
|
<< " Save submission to a file<br />"
|
||
|
<< "<input type=\"checkbox\" name=\"restore\" />"
|
||
|
<< "Restore data from the last saved submission"
|
||
|
<< "</td></tr>" << endl;
|
||
|
|
||
|
cout << "</table>" << endl;
|
||
|
|
||
|
cout << "<div class=\"center\"><p>"
|
||
|
<< "<input type=\"submit\" name=\"submit\" value=\"Submit\" />"
|
||
|
<< "<input type=\"reset\" value=\"Nevermind\" />"
|
||
|
<< "</p></div></form>" << endl;
|
||
|
}
|
||
|
|
||
|
// Main Street, USA
|
||
|
int main(int /*argc*/, char** /*argv*/)
|
||
|
{
|
||
|
try
|
||
|
{
|
||
|
#if HAVE_GETTIMEOFDAY
|
||
|
timeval start;
|
||
|
gettimeofday(&start, NULL);
|
||
|
#endif
|
||
|
|
||
|
// Create a new Cgicc object containing all the CGI data
|
||
|
Cgicc cgi;
|
||
|
|
||
|
// If the user wants to throw an exception, go ahead and do it
|
||
|
if( cgi.queryCheckbox("throw") && !cgi.queryCheckbox("restore") )
|
||
|
throw std::runtime_error("User-requested Exception thrown in main()");
|
||
|
|
||
|
// Output the HTTP headers for an HTML document, and the HTML 4.0 DTD info
|
||
|
cout << HTTPHTMLHeader() << HTMLDoctype(HTMLDoctype::eStrict) << endl;
|
||
|
cout << html().set("lang", "en").set("dir", "ltr") << endl;
|
||
|
|
||
|
// Set up the page's header and title.
|
||
|
// I will put in lfs to ease reading of the produced HTML.
|
||
|
cout << head() << endl;
|
||
|
|
||
|
// Output the style sheet portion of the header
|
||
|
cout << style() << comment() << endl;
|
||
|
cout << styles;
|
||
|
cout << comment() << style() << endl;
|
||
|
|
||
|
cout << title() << "GNU cgicc v" << cgi.getVersion() << " Test"
|
||
|
<< title() << endl;
|
||
|
|
||
|
cout << head() << endl;
|
||
|
|
||
|
// Start the HTML body
|
||
|
cout << body() << endl;
|
||
|
|
||
|
cout << h1() << "GNU cgi" << span("cc").set("class", "red")
|
||
|
<< " v" << cgi.getVersion() << " Test" << h1() << endl;
|
||
|
|
||
|
// Get a pointer to the environment
|
||
|
const CgiEnvironment& env = cgi.getEnvironment();
|
||
|
|
||
|
// Generic thank you message
|
||
|
cout << comment() << "This page generated by cgicc for "
|
||
|
<< env.getRemoteHost() << comment() << endl;
|
||
|
cout << h4() << "Thanks for using cgi" << span("cc").set("class", "red")
|
||
|
<< ", " << env.getRemoteHost()
|
||
|
<< '(' << env.getRemoteAddr() << ")!" << h4() << endl;
|
||
|
|
||
|
// If the user wants to save the submission, do it
|
||
|
if( cgi.queryCheckbox("save") )
|
||
|
{
|
||
|
// Make sure the save file is readable and writable by the CGI process
|
||
|
cgi.save("save");
|
||
|
cout << p(h2("Data Saved")) << endl;
|
||
|
|
||
|
cout << cgicc::div().set("class", "notice") << endl;
|
||
|
cout << "Your data has been saved, and may be restored (by anyone) "
|
||
|
<< "via the same form." << endl << cgicc::div() << p() << endl;
|
||
|
}
|
||
|
|
||
|
// If the user wants to restore from the last submission, do it
|
||
|
if( cgi.queryCheckbox("restore") )
|
||
|
{
|
||
|
cgi.restore("save");
|
||
|
cout << p(h2("Data Restored")) << endl;
|
||
|
|
||
|
cout << cgicc::div().set("class", "notice") << endl;
|
||
|
cout << "The data displayed has been restored from a file on disk."
|
||
|
<< endl << cgicc::div() << p() << endl;
|
||
|
}
|
||
|
|
||
|
// If the user requested a dump of the environment,
|
||
|
// create a simple table showing the values of the
|
||
|
// environment variables
|
||
|
if( cgi.queryCheckbox("showEnv") )
|
||
|
dumpEnvironment(env);
|
||
|
|
||
|
// If the user requested, print out the raw form data from
|
||
|
// the vector of FormEntries. This will contain every
|
||
|
// element in the list.
|
||
|
// This is one of two ways to get at form data, the other
|
||
|
// being the use of Cgicc's getElement() methods.
|
||
|
if( cgi.queryCheckbox("showFE") )
|
||
|
dumpList(cgi);
|
||
|
|
||
|
// If the user requested data via Cgicc's getElement() methods, do it.
|
||
|
// This is different than the use of the list of FormEntries
|
||
|
// because it requires prior knowledge of the name of form elements.
|
||
|
// Usually they will be known, but you never know.
|
||
|
if( cgi.queryCheckbox("showForm") )
|
||
|
showForm(cgi);
|
||
|
|
||
|
// Print out the form to do it again
|
||
|
cout << br() << endl;
|
||
|
printForm(cgi);
|
||
|
cout << hr().set("class", "half") << endl;
|
||
|
|
||
|
// Information on cgicc
|
||
|
cout << cgicc::div().set("align", "center").set("class", "smaller") << endl;
|
||
|
cout << "GNU cgi" << span("cc").set("class", "red") << " v";
|
||
|
cout << cgi.getVersion() << br() << endl;
|
||
|
cout << "Compiled at " << cgi.getCompileTime();
|
||
|
cout << " on " << cgi.getCompileDate() << br() << endl;
|
||
|
|
||
|
cout << "Configured for " << cgi.getHost();
|
||
|
#if HAVE_UNAME
|
||
|
struct utsname info;
|
||
|
if( uname(&info) != -1 )
|
||
|
{
|
||
|
cout << ". Running on " << info.sysname;
|
||
|
cout << ' ' << info.release << " (";
|
||
|
cout << info.nodename << ")." << endl;
|
||
|
}
|
||
|
#else
|
||
|
cout << "." << endl;
|
||
|
#endif
|
||
|
|
||
|
#if HAVE_GETTIMEOFDAY
|
||
|
// Information on this query
|
||
|
timeval end;
|
||
|
gettimeofday(&end, NULL);
|
||
|
long us = ((end.tv_sec - start.tv_sec) * 1000000)
|
||
|
+ (end.tv_usec - start.tv_usec);
|
||
|
|
||
|
cout << br() << "Total time for request = " << us << " us";
|
||
|
cout << " (" << static_cast<double>(us / 1000000.0) << " s)";
|
||
|
#endif
|
||
|
|
||
|
// End of document
|
||
|
cout << cgicc::div() << endl;
|
||
|
cout << body() << html() << endl;
|
||
|
|
||
|
// No chance for failure in this example
|
||
|
return EXIT_SUCCESS;
|
||
|
}
|
||
|
|
||
|
// Did any errors occur?
|
||
|
catch( const std::exception& e )
|
||
|
{
|
||
|
|
||
|
// This is a dummy exception handler, as it doesn't really do
|
||
|
// anything except print out information.
|
||
|
|
||
|
// Reset all the HTML elements that might have been used to
|
||
|
// their initial state so we get valid output
|
||
|
html::reset(); head::reset(); body::reset();
|
||
|
title::reset(); h1::reset(); h4::reset();
|
||
|
comment::reset(); td::reset(); tr::reset();
|
||
|
table::reset(); cgicc::div::reset(); p::reset();
|
||
|
a::reset(); h2::reset(); colgroup::reset();
|
||
|
|
||
|
// Output the HTTP headers for an HTML document, and the HTML 4.0 DTD info
|
||
|
cout << HTTPHTMLHeader() << HTMLDoctype(HTMLDoctype::eStrict) << endl;
|
||
|
cout << html().set("lang", "en").set("dir", "ltr") << endl;
|
||
|
|
||
|
// Set up the page's header and title.
|
||
|
// I will put in lfs to ease reading of the produced HTML.
|
||
|
cout << head() << endl;
|
||
|
|
||
|
// Output the style sheet portion of the header
|
||
|
cout << style() << comment() << endl;
|
||
|
cout << "body { color: black; background-color: white; }" << endl;
|
||
|
cout << "hr.half { width: 60%; align: center; }" << endl;
|
||
|
cout << "span.red, STRONG.red { color: red; }" << endl;
|
||
|
cout << "div.notice { border: solid thin; padding: 1em; margin: 1em 0; "
|
||
|
<< "background: #ddd; }" << endl;
|
||
|
|
||
|
cout << comment() << style() << endl;
|
||
|
|
||
|
cout << title("GNU cgicc exception") << endl;
|
||
|
cout << head() << endl;
|
||
|
|
||
|
cout << body() << endl;
|
||
|
|
||
|
cout << h1() << "GNU cgi" << span("cc", set("class", "red"))
|
||
|
<< " caught an exception" << h1() << endl;
|
||
|
|
||
|
cout << cgicc::div().set("align", "center").set("class", "notice") << endl;
|
||
|
|
||
|
cout << h2(e.what()) << endl;
|
||
|
|
||
|
// End of document
|
||
|
cout << cgicc::div() << endl;
|
||
|
cout << hr().set("class", "half") << endl;
|
||
|
cout << body() << html() << endl;
|
||
|
|
||
|
return EXIT_SUCCESS;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Print out a table of the CgiEnvironment
|
||
|
void
|
||
|
dumpEnvironment(const CgiEnvironment& env)
|
||
|
{
|
||
|
// This is just a brain-dead dump of information.
|
||
|
// Almost all of this code is for HTML formatting
|
||
|
cout << h2("Environment information from CgiEnvironment") << endl;
|
||
|
|
||
|
cout << cgicc::div().set("align", "center") << endl;
|
||
|
|
||
|
cout << table() << endl;
|
||
|
|
||
|
cout << tr() << td("Request Method").set("class", "title")
|
||
|
<< td(env.getRequestMethod()).set("class", "data") << tr() << endl;
|
||
|
cout << tr() << td("Path Info").set("class", "title")
|
||
|
<< td(env.getPathInfo()).set("class", "data") << tr() << endl;
|
||
|
cout << tr() << td("Path Translated").set("class", "title")
|
||
|
<< td(env.getPathTranslated()).set("class", "data") << tr() << endl;
|
||
|
cout << tr() << td("Script Name").set("class", "title")
|
||
|
<< td(env.getScriptName()).set("class", "data") << tr() << endl;
|
||
|
cout << tr() << td("HTTP Referrer").set("class", "title")
|
||
|
<< td(env.getReferrer()).set("class", "data") << tr() << endl;
|
||
|
cout << tr() << td("HTTP Cookie").set("class", "title")
|
||
|
<< td(env.getCookies()).set("class", "data") << tr() << endl;
|
||
|
cout << tr() << td("Query String").set("class", "title")
|
||
|
<< td(env.getQueryString()).set("class", "data") << tr() << endl;
|
||
|
cout << tr() << td("Content Length").set("class", "title")
|
||
|
<< td().set("class", "data") << env.getContentLength()
|
||
|
<< td() << tr() << endl;
|
||
|
cout << tr() << td("Post Data").set("class", "title")
|
||
|
<< td().set("class", "data")
|
||
|
<< pre(env.getPostData()).set("class", "data") << td()
|
||
|
<< tr() << endl;
|
||
|
cout << tr() << td("Remote Host").set("class", "title")
|
||
|
<< td(env.getRemoteHost()).set("class", "data") << tr() << endl;
|
||
|
cout << tr() << td("Remote Address").set("class", "title")
|
||
|
<< td(env.getRemoteAddr()).set("class", "data") << tr() << endl;
|
||
|
cout << tr() << td("Authorization Type").set("class", "title")
|
||
|
<< td(env.getAuthType()).set("class", "data") << tr() << endl;
|
||
|
cout << tr() << td("Remote User").set("class", "title")
|
||
|
<< td(env.getRemoteUser()).set("class", "data") << tr() << endl;
|
||
|
cout << tr() << td("Remote Identification").set("class", "title")
|
||
|
<< td(env.getRemoteIdent()).set("class", "data") << tr() << endl;
|
||
|
cout << tr() << td("Content Type").set("class", "title")
|
||
|
<< td(env.getContentType()).set("class", "data") << tr() << endl;
|
||
|
cout << tr() << td("HTTP Accept").set("class", "title")
|
||
|
<< td(env.getAccept()).set("class", "data") << tr() << endl;
|
||
|
cout << tr() << td("User Agent").set("class", "title")
|
||
|
<< td(env.getUserAgent()).set("class", "data") << tr() << endl;
|
||
|
cout << tr() << td("Server Software").set("class", "title")
|
||
|
<< td(env.getServerSoftware()).set("class", "data") << tr() << endl;
|
||
|
cout << tr() << td("Server Name").set("class", "title")
|
||
|
<< td(env.getServerName()).set("class", "data") << tr() << endl;
|
||
|
cout << tr() << td("Gateway Interface").set("class", "title")
|
||
|
<< td(env.getGatewayInterface()).set("class", "data") << tr() << endl;
|
||
|
cout << tr() << td("Server Protocol").set("class", "title")
|
||
|
<< td(env.getServerProtocol()).set("class", "data") << tr() << endl;
|
||
|
cout << tr() << td("Server Port").set("class", "title")
|
||
|
<< td().set("class", "data") << env.getServerPort()
|
||
|
<< td() << tr() << endl;
|
||
|
cout << tr() << td("HTTPS").set("class", "title")
|
||
|
<< td().set("class", "data") << (env.usingHTTPS() ? "true" : "false")
|
||
|
<< td() << tr() << endl;
|
||
|
cout << tr() << td("Redirect Request").set("class", "title")
|
||
|
<< td(env.getRedirectRequest()).set("class", "data") << tr() << endl;
|
||
|
cout << tr() << td("Redirect URL").set("class", "title")
|
||
|
<< td(env.getRedirectURL()).set("class", "data") << tr() << endl;
|
||
|
cout << tr() << td("Redirect Status").set("class", "title")
|
||
|
<< td(env.getRedirectStatus()).set("class", "data") << tr() << endl;
|
||
|
|
||
|
cout << table() << cgicc::div() << endl;
|
||
|
}
|
||
|
|
||
|
// Print out the value of every form element
|
||
|
void
|
||
|
dumpList(const Cgicc& formData)
|
||
|
{
|
||
|
cout << h2("Form Data via vector") << endl;
|
||
|
|
||
|
cout << cgicc::div().set("align", "center") << endl;
|
||
|
|
||
|
cout << table() << endl;
|
||
|
|
||
|
cout << tr().set("class", "title") << td("Element Name")
|
||
|
<< td("Element Value") << tr() << endl;
|
||
|
|
||
|
// Iterate through the vector, and print out each value
|
||
|
const_form_iterator iter;
|
||
|
for( iter = formData.getElements().begin();
|
||
|
iter != formData.getElements().end();
|
||
|
++iter )
|
||
|
{
|
||
|
cout << tr().set("class", "data") << td(iter->getName())
|
||
|
<< td(iter->getValue()) << tr() << endl;
|
||
|
}
|
||
|
cout << table() << cgicc::div() << endl;
|
||
|
}
|
||
|
|
||
|
// Print out information customized for each element
|
||
|
void
|
||
|
showForm(const Cgicc& formData)
|
||
|
{
|
||
|
|
||
|
// I am using an if statement to check if each element is found
|
||
|
cout << h2("Form Data via Cgicc") << endl;
|
||
|
|
||
|
cout << cgicc::div().set("class", "notice") << endl;
|
||
|
|
||
|
//getElement
|
||
|
const_form_iterator name = formData.getElement("name");
|
||
|
if( name != (*formData).end() && !name->isEmpty() )
|
||
|
cout << "Your name is " << **name << '.' << br() << endl;
|
||
|
else
|
||
|
cout << "You don't have a name." << br() << endl;
|
||
|
|
||
|
// getElement and getDoubleValue
|
||
|
const_form_iterator salary = formData.getElement("bucks");
|
||
|
if( salary != (*formData).end() && !salary->isEmpty() )
|
||
|
cout << "You make " << (*salary).getDoubleValue(80, 120)
|
||
|
<< " million dollars." << br() << endl;
|
||
|
else
|
||
|
cout << "You don't have a salary." << br() << endl;
|
||
|
|
||
|
// getElement and getIntegerValue
|
||
|
const_form_iterator hours = formData.getElement("time");
|
||
|
if( hours != (*formData).end() && !(*hours).isEmpty() )
|
||
|
cout << "You've wasted " << (*hours).getIntegerValue()
|
||
|
<< " hours on the web." << br() << endl;
|
||
|
else
|
||
|
cout << "You haven't wasted any time on the web." << br() << endl;
|
||
|
|
||
|
// getElement and getStrippedValue
|
||
|
const_form_iterator thoughts = formData.getElement("thoughts");
|
||
|
if( thoughts != (*formData).end() && !(*thoughts).isEmpty() )
|
||
|
{
|
||
|
std::string temp = (*thoughts).getStrippedValue();
|
||
|
cout << "Your thoughts: " << temp << br() << endl;
|
||
|
}
|
||
|
else
|
||
|
cout << "You don't have any thoughts!?" << br() << endl;
|
||
|
|
||
|
// queryCheckbox
|
||
|
if( formData.queryCheckbox("hungry") )
|
||
|
cout << "You are hungry." << br() << endl;
|
||
|
else
|
||
|
cout << "You are not hungry." << br() << endl;
|
||
|
|
||
|
// getElement
|
||
|
std::vector<FormEntry> flavors;
|
||
|
formData.getElement("flavors", flavors);
|
||
|
if( !flavors.empty() )
|
||
|
{
|
||
|
cout << "You like ";
|
||
|
for( std::string::size_type i = 0; i < flavors.size(); i++ )
|
||
|
{
|
||
|
cout << flavors[i].getValue();
|
||
|
if( i < flavors.size() - 2 )
|
||
|
cout << ", ";
|
||
|
else if( i == flavors.size() - 2 )
|
||
|
cout << " and ";
|
||
|
}
|
||
|
cout << " ice cream." << br() << endl;
|
||
|
}
|
||
|
else
|
||
|
cout << "You don't like ice cream!?" << br() << endl;
|
||
|
|
||
|
// getElement
|
||
|
const_form_iterator hair = formData.getElement("hair");
|
||
|
if( hair != (*formData).end() )
|
||
|
cout << "Your hair is " << **hair << '.' << br() << endl;
|
||
|
else
|
||
|
cout << "You don't have any hair." << br() << endl;
|
||
|
|
||
|
cout << "You surf the web with " << formData("browser") << '.'
|
||
|
<< br() << endl;
|
||
|
|
||
|
// getElement
|
||
|
std::vector<FormEntry> authors;
|
||
|
formData.getElement("authors", authors);
|
||
|
if( !authors.empty() )
|
||
|
{
|
||
|
cout << "You like to read books by ";
|
||
|
for( std::string::size_type i = 0; i < authors.size(); ++i )
|
||
|
{
|
||
|
cout << authors[i].getValue();
|
||
|
if( i < authors.size() - 2 )
|
||
|
cout << ", ";
|
||
|
else if( i == authors.size() - 2 )
|
||
|
cout << " and ";
|
||
|
}
|
||
|
cout << "." << br() << endl;
|
||
|
}
|
||
|
else
|
||
|
cout << "You don't like to read!?" << br() << endl;
|
||
|
|
||
|
cout << cgicc::div() << endl;
|
||
|
}
|