00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00027 #include <new>
00028 #include <string>
00029 #include <vector>
00030 #include <stdexcept>
00031 #include <iostream>
00032 #include <cstdlib>
00033
00034 #include "cgicc/CgiDefs.h"
00035 #include "cgicc/Cgicc.h"
00036 #include "cgicc/HTTPHTMLHeader.h"
00037 #include "cgicc/HTMLClasses.h"
00038
00039 #if HAVE_UNAME
00040 # include <sys/utsname.h>
00041 #endif
00042
00043 #if HAVE_SYS_TIME_H
00044 # include <sys/time.h>
00045 #endif
00046
00047
00048
00049 #if DEBUG
00050 STDNS ofstream gLogFile( "/change_this_path/cgicc.log", STDNS ios::app );
00051 #endif
00052
00053 #if CGICC_USE_NAMESPACES
00054 using namespace std;
00055 using namespace cgicc;
00056 #else
00057 # define div div_
00058 # define link link_
00059 # define select select_
00060 #endif
00061
00062
00063 void dumpEnvironment(const CgiEnvironment& env);
00064 void dumpList(const Cgicc& formData);
00065 void showForm(const Cgicc& formData);
00066
00067
00068 int
00069 main(int ,
00070 char ** )
00071 {
00072 try {
00073 #if HAVE_GETTIMEOFDAY
00074 timeval start;
00075 gettimeofday(&start, NULL);
00076 #endif
00077
00078
00079 Cgicc cgi;
00080
00081
00082 if(cgi.queryCheckbox("throw") && ! cgi.queryCheckbox("restore"))
00083 throw STDNS runtime_error("User-requested Exception thrown in main()");
00084
00085
00086 cout << HTTPHTMLHeader() << HTMLDoctype(HTMLDoctype::eStrict) << endl;
00087 cout << html().set("lang", "en").set("dir", "ltr") << endl;
00088
00089
00090
00091 cout << head() << endl;
00092
00093
00094 cout << style() << comment() << endl;
00095 cout << "body { color: black; background-color: white; }" << endl;
00096 cout << "hr.half { width: 60%; align: center; }" << endl;
00097 cout << "span.red, strong.red { color: red; }" << endl;
00098 cout << "div.smaller { font-size: small; }" << endl;
00099 cout << "div.notice { border: solid thin; padding: 1em; margin: 1em 0; "
00100 << "background: #ddd; }" << endl;
00101 cout << "span.blue { color: blue; }" << endl;
00102 cout << "col.title { color: white; background-color: black; ";
00103 cout << "font-weight: bold; text-align: center; }" << endl;
00104 cout << "col.data { background-color: #DDD; text-align: left; }" << endl;
00105 cout << "td.data, tr.data { background-color: #ddd; text-align: left; }"
00106 << endl;
00107 cout << "td.grayspecial { background-color: #ddd; text-align: left; }"
00108 << endl;
00109 cout << "td.ltgray, tr.ltgray { background-color: #ddd; }" << endl;
00110 cout << "td.dkgray, tr.dkgray { background-color: #bbb; }" << endl;
00111 cout << "col.black, td.black, td.title, tr.title { color: white; "
00112 << "background-color: black; font-weight: bold; text-align: center; }"
00113 << endl;
00114 cout << "col.gray, td.gray { background-color: #ddd; text-align: center; }"
00115 << endl;
00116 cout << "table.cgi { left-margin: auto; right-margin: auto; width: 90%; }"
00117 << endl;
00118
00119 cout << comment() << style() << endl;
00120
00121 cout << title() << "GNU cgicc v" << cgi.getVersion() << " Test Results"
00122 << title() << endl;
00123
00124 cout << head() << endl;
00125
00126
00127 cout << body() << endl;
00128
00129 cout << h1() << "GNU cgi" << span("cc").set("class","red")
00130 << " v"<< cgi.getVersion() << " Test Results" << h1() << endl;
00131
00132
00133 const CgiEnvironment& env = cgi.getEnvironment();
00134
00135
00136 cout << comment() << "This page generated by cgicc for "
00137 << env.getRemoteHost() << comment() << endl;
00138 cout << h4() << "Thanks for using cgi" << span("cc").set("class", "red")
00139 << ", " << env.getRemoteHost()
00140 << '(' << env.getRemoteAddr() << ")!" << h4() << endl;
00141
00142
00143 if(cgi.queryCheckbox("save")) {
00144 cgi.save("save");
00145 cout << p(h2("Data Saved")) << endl;
00146
00147 cout << CGICCNS div().set("class", "notice") << endl;
00148 cout << "Your data has been saved, and may be restored (by anyone) "
00149 << "via the same form." << endl << CGICCNS div() << p() << endl;
00150 }
00151
00152
00153 if(cgi.queryCheckbox("restore")) {
00154 cgi.restore("save");
00155 cout << p(h2("Data Restored")) << endl;
00156
00157 cout << CGICCNS div().set("class", "notice") << endl;
00158 cout << "The data displayed has been restored from a file on disk."
00159 << endl << CGICCNS div() << p() << endl;
00160 }
00161
00162
00163
00164
00165 if(cgi.queryCheckbox("showEnv"))
00166 dumpEnvironment(env);
00167
00168
00169
00170
00171
00172
00173 if(cgi.queryCheckbox("showFE"))
00174 dumpList(cgi);
00175
00176
00177
00178
00179
00180 if(cgi.queryCheckbox("showForm"))
00181 showForm(cgi);
00182
00183
00184 cout << p() << CGICCNS div().set("align","center");
00185 cout << a("Back to form").set("href", cgi.getEnvironment().getReferrer())
00186 << endl;
00187 cout << CGICCNS div() << br() << hr(set("class","half")) << endl;
00188
00189
00190 cout << CGICCNS div().set("align","center").set("class","smaller") << endl;
00191 cout << "GNU cgi" << span("cc").set("class","red") << " v";
00192 cout << cgi.getVersion() << br() << endl;
00193 cout << "Compiled at " << cgi.getCompileTime();
00194 cout << " on " << cgi.getCompileDate() << br() << endl;
00195
00196 cout << "Configured for " << cgi.getHost();
00197 #if HAVE_UNAME
00198 struct utsname info;
00199 if(uname(&info) != -1) {
00200 cout << ". Running on " << info.sysname;
00201 cout << ' ' << info.release << " (";
00202 cout << info.nodename << ")." << endl;
00203 }
00204 #else
00205 cout << "." << endl;
00206 #endif
00207
00208 #if HAVE_GETTIMEOFDAY
00209
00210 timeval end;
00211 gettimeofday(&end, NULL);
00212 long us = ((end.tv_sec - start.tv_sec) * 1000000)
00213 + (end.tv_usec - start.tv_usec);
00214
00215 cout << br() << "Total time for request = " << us << " us";
00216 cout << " (" << (double) (us/1000000.0) << " s)";
00217 #endif
00218
00219
00220 cout << CGICCNS div() << endl;
00221 cout << body() << html() << endl;
00222
00223
00224 return EXIT_SUCCESS;
00225 }
00226
00227
00228 catch(const STDNS exception& e) {
00229
00230
00231
00232
00233
00234
00235 html::reset(); head::reset(); body::reset();
00236 title::reset(); h1::reset(); h4::reset();
00237 comment::reset(); td::reset(); tr::reset();
00238 table::reset(); CGICCNS div::reset(); p::reset();
00239 a::reset(); h2::reset(); colgroup::reset();
00240
00241
00242 cout << HTTPHTMLHeader() << HTMLDoctype(HTMLDoctype::eStrict) << endl;
00243 cout << html().set("lang","en").set("dir","ltr") << endl;
00244
00245
00246
00247 cout << head() << endl;
00248
00249
00250 cout << style() << comment() << endl;
00251 cout << "body { color: black; background-color: white; }" << endl;
00252 cout << "hr.half { width: 60%; align: center; }" << endl;
00253 cout << "span.red, STRONG.red { color: red; }" << endl;
00254 cout << "div.notice { border: solid thin; padding: 1em; margin: 1em 0; "
00255 << "background: #ddd; }" << endl;
00256
00257 cout << comment() << style() << endl;
00258
00259 cout << title("GNU cgicc exception") << endl;
00260 cout << head() << endl;
00261
00262 cout << body() << endl;
00263
00264 cout << h1() << "GNU cgi" << span("cc", set("class","red"))
00265 << " caught an exception" << h1() << endl;
00266
00267 cout << CGICCNS div().set("align","center").set("class","notice") << endl;
00268
00269 cout << h2(e.what()) << endl;
00270
00271
00272 cout << CGICCNS div() << endl;
00273 cout << hr().set("class","half") << endl;
00274 cout << body() << html() << endl;
00275
00276 return EXIT_SUCCESS;
00277 }
00278 }
00279
00280
00281 void
00282 dumpEnvironment(const CgiEnvironment& env)
00283 {
00284
00285
00286 cout << h2("Environment information from CgiEnvironment") << endl;
00287
00288 cout << CGICCNS div().set("align","center") << endl;
00289
00290 cout << table().set("border","0").set("rules","none").set("frame","void")
00291 .set("cellspacing","2").set("cellpadding","2")
00292 .set("class","cgi") << endl;
00293 cout << colgroup().set("span","2") << endl;
00294 cout << col().set("align","center").set("class","title").set("span","1")
00295 << endl;
00296 cout << col().set("align","left").set("class","data").set("span","1")
00297 << endl;
00298 cout << colgroup() << endl;
00299
00300 cout << tr() << td("Request Method").set("class","title")
00301 << td(env.getRequestMethod()).set("class","data") << tr() << endl;
00302 cout << tr() << td("Path Info").set("class","title")
00303 << td(env.getPathInfo()).set("class","data") << tr() << endl;
00304 cout << tr() << td("Path Translated").set("class","title")
00305 << td(env.getPathTranslated()).set("class","data") << tr() << endl;
00306 cout << tr() << td("Script Name").set("class","title")
00307 << td(env.getScriptName()).set("class","data") << tr() << endl;
00308 cout << tr() << td("HTTP Referrer").set("class","title")
00309 << td(env.getReferrer()).set("class","data") << tr() << endl;
00310 cout << tr() << td("HTTP Cookie").set("class","title")
00311 << td(env.getCookies()).set("class","data") << tr() << endl;
00312 cout << tr() << td("Query String").set("class","title")
00313 << td(env.getQueryString()).set("class","data") << tr() << endl;
00314 cout << tr() << td("Content Length").set("class","title")
00315 << td().set("class","data") << env.getContentLength()
00316 << td() << tr() << endl;
00317 cout << tr() << td("Post Data").set("class","title")
00318 << td().set("class","data")
00319 << pre(env.getPostData()).set("class","data") << td()
00320 << tr() << endl;
00321 cout << tr() << td("Remote Host").set("class","title")
00322 << td(env.getRemoteHost()).set("class","data") << tr() << endl;
00323 cout << tr() << td("Remote Address").set("class","title")
00324 << td(env.getRemoteAddr()).set("class","data") << tr() << endl;
00325 cout << tr() << td("Authorization Type").set("class","title")
00326 << td(env.getAuthType()).set("class","data") << tr() << endl;
00327 cout << tr() << td("Remote User").set("class","title")
00328 << td(env.getRemoteUser()).set("class","data") << tr() << endl;
00329 cout << tr() << td("Remote Identification").set("class","title")
00330 << td(env.getRemoteIdent()).set("class","data") << tr() << endl;
00331 cout << tr() << td("Content Type").set("class","title")
00332 << td(env.getContentType()).set("class","data") << tr() << endl;
00333 cout << tr() << td("HTTP Accept").set("class","title")
00334 << td(env.getAccept()).set("class","data") << tr() << endl;
00335 cout << tr() << td("User Agent").set("class","title")
00336 << td(env.getUserAgent()).set("class","data") << tr() << endl;
00337 cout << tr() << td("Server Software").set("class","title")
00338 << td(env.getServerSoftware()).set("class","data") << tr() << endl;
00339 cout << tr() << td("Server Name").set("class","title")
00340 << td(env.getServerName()).set("class","data") << tr() << endl;
00341 cout << tr() << td("Gateway Interface").set("class","title")
00342 << td(env.getGatewayInterface()).set("class","data") << tr() << endl;
00343 cout << tr() << td("Server Protocol").set("class","title")
00344 << td(env.getServerProtocol()).set("class","data") << tr() << endl;
00345 cout << tr() << td("Server Port").set("class","title")
00346 << td().set("class","data") << env.getServerPort()
00347 << td() << tr() << endl;
00348 cout << tr() << td("HTTPS").set("class","title")
00349 << td().set("class","data") << (env.usingHTTPS() ? "true" : "false")
00350 << td() << tr() << endl;
00351 cout << tr() << td("Redirect Request").set("class","title")
00352 << td(env.getRedirectRequest()).set("class","data") << tr() << endl;
00353 cout << tr() << td("Redirect URL").set("class","title")
00354 << td(env.getRedirectURL()).set("class","data") << tr() << endl;
00355 cout << tr() << td("Redirect Status").set("class","title")
00356 << td(env.getRedirectStatus()).set("class","data") << tr() << endl;
00357
00358 cout << table() << CGICCNS div() << endl;
00359 }
00360
00361
00362 void
00363 dumpList(const Cgicc& formData)
00364 {
00365 cout << h2("Form Data via vector") << endl;
00366
00367 cout << CGICCNS div().set("align","center") << endl;
00368
00369 cout << table().set("border","0").set("rules","none").set("frame","void")
00370 .set("cellspacing","2").set("cellpadding","2")
00371 .set("class","cgi") << endl;
00372 cout << colgroup().set("span","2") << endl;
00373 cout << col().set("align","center").set("span","2") << endl;
00374 cout << colgroup() << endl;
00375
00376 cout << tr().set("class","title") << td("Element Name")
00377 << td("Element Value") << tr() << endl;
00378
00379
00380 const_form_iterator iter;
00381 for(iter = formData.getElements().begin();
00382 iter != formData.getElements().end();
00383 ++iter) {
00384 cout << tr().set("class","data") << td(iter->getName())
00385 << td(iter->getValue()) << tr() << endl;
00386 }
00387 cout << table() << CGICCNS div() << endl;
00388 }
00389
00390
00391 void
00392 showForm(const Cgicc& formData)
00393 {
00394
00395
00396 cout << h2("Form Data via Cgicc") << endl;
00397
00398 cout << CGICCNS div().set("class","notice") << endl;
00399
00400
00401 const_form_iterator name = formData.getElement("name");
00402 if(name != (*formData).end() && ! name->isEmpty())
00403 cout << "Your name is " << **name << '.' << br() << endl;
00404 else
00405 cout << "You don't have a name." << br() << endl;
00406
00407
00408 const_form_iterator salary = formData.getElement("bucks");
00409 if(salary != (*formData).end() && ! salary->isEmpty())
00410 cout << "You make " << (*salary).getDoubleValue(80, 120)
00411 << " million dollars." << br() << endl;
00412 else
00413 cout << "You don't have a salary." << br() << endl;
00414
00415
00416 const_form_iterator hours = formData.getElement("time");
00417 if(hours != (*formData).end() && ! (*hours).isEmpty())
00418 cout << "You've wasted " << (*hours).getIntegerValue()
00419 << " hours on the web." << br() << endl;
00420 else
00421 cout << "You haven't wasted any time on the web." << br() << endl;
00422
00423
00424 const_form_iterator thoughts = formData.getElement("thoughts");
00425 if(thoughts != (*formData).end() && ! (*thoughts).isEmpty()) {
00426 STDNS string temp = (*thoughts).getStrippedValue();
00427 cout << "Your thoughts : " << temp << br() << endl;
00428 }
00429 else
00430 cout << "You don't have any thoughts!?" << br() << endl;
00431
00432
00433 if(formData.queryCheckbox("hungry"))
00434 cout << "You are hungry." << br() << endl;
00435 else
00436 cout << "You are not hungry." << br() << endl;
00437
00438
00439 STDNS vector<FormEntry> flavors;
00440 formData.getElement("flavors", flavors);
00441 if(! flavors.empty()) {
00442 cout << "You like ";
00443 for(STDNS string::size_type i = 0; i < flavors.size(); i++) {
00444 cout << flavors[i].getValue();
00445 if(i < flavors.size() - 2)
00446 cout << ", ";
00447 else if(i == flavors.size() - 2)
00448 cout << " and ";
00449 }
00450 cout << " ice cream." << br() << endl;
00451 }
00452 else
00453 cout << "You don't like ice cream!?" << br() << endl;
00454
00455
00456 const_form_iterator hair = formData.getElement("hair");
00457 if(hair != (*formData).end())
00458 cout << "Your hair is " << **hair << '.' << br() << endl;
00459 else
00460 cout << "You don't have any hair." << br() << endl;
00461
00462 const_form_iterator vote = formData.getElement("vote");
00463 if(vote != (*formData).end())
00464 cout << "You voted for " << **vote << '.' << br() << endl;
00465 else
00466 cout << "This should never happen. ERROR!" << br() << endl;
00467
00468
00469 STDNS vector<FormEntry> friends;
00470 formData.getElement("friends", friends);
00471 if(! friends.empty()) {
00472 cout << "You like ";
00473 for(STDNS string::size_type i = 0; i < friends.size(); i++) {
00474 cout << friends[i].getValue();
00475 if(i < friends.size() - 2)
00476 cout << ", ";
00477 else if(i == friends.size() - 2)
00478 cout << " and ";
00479 }
00480 cout << " on Friends." << br() << endl;
00481 }
00482 else
00483 cout << "You don't watch Friends!?" << br() << endl;
00484
00485 cout << CGICCNS div() << endl;
00486 }