00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #ifndef cgiCLASS_H
00015 #define cgiCLASS_H
00016
00017 #include "Astring.h"
00018 #include <map>
00019 #include <string>
00020 #include <sstream>
00021 #include <fstream>
00022 #include <iomanip>
00023 #include "ocCommon.h"
00024
00025 using namespace std;
00026
00027
00028
00029
00030
00031
00032
00033 enum cgiObjectId { cgi, html, head, body, generic};
00034
00035
00036 class cgiEnvironment;
00037
00038
00039
00040 typedef map < string, aString > queryStringMap;
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050 class cgiInput
00051 {
00052
00053
00054
00055
00056 private:
00057 queryStringMap theMap;
00058 ocFiles fileMap;
00059 aString safe;
00060 protected:
00061 aString uploadPath;
00062
00063
00064
00065
00066
00067
00068 public:
00069
00070 cgiInput();
00071 ~cgiInput();
00072
00073
00074
00075 void set( const char * boundaryString, size_t size = 0 );
00076
00077
00078
00079
00080
00081
00082 void setMultipart( aString boundary );
00083
00084
00085
00086 aString & Safe(void);
00087
00088
00089 queryStringMap & TheMap(void);
00090
00091
00092 ocFiles & FileMap(void);
00093
00094
00095 int count( const char * key );
00096
00097 aString & operator [] ( const char * key );
00098
00099 friend class cgiEnvironment;
00100 };
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112 class cgiEnvironment
00113 {
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128 private:
00129
00130 aString contentLength;
00131 aString contentType;
00132 aString contentBoundary;
00133 aString gatewayInterface;
00134 aString httpAccept;
00135 aString httpUserAgent;
00136 aString pathInfo;
00137 aString pathTranslated;
00138 aString queryString;
00139 aString remoteAddr;
00140 aString remoteHost;
00141 aString remoteIdent;
00142 aString requestMethod;
00143 aString remoteUser;
00144 aString scriptName;
00145 aString serverName;
00146 aString serverPort;
00147 aString serverProtocol;
00148 aString serverSoftware;
00149 cgiInput clientArguments;
00150 int contentSize;
00151
00152 public:
00153
00154
00155
00156
00157
00158
00159 cgiEnvironment(const char * uploadPath = NULL);
00160 ~cgiEnvironment();
00161
00162
00163 aString & ContentLength(void);
00164
00165 aString & ContentType(void);
00166
00167 aString & GatewayInterface(void);
00168
00169 aString & HttpAccept(void);
00170
00171 aString & HttpUserAgent(void);
00172
00173 aString & PathInfo(void);
00174
00175
00176 aString & PathTranslated(void);
00177
00178 aString & QueryString(void);
00179
00180 aString & RemoteAddr(void);
00181
00182 aString & RemoteHost(void);
00183
00184
00185 aString & RemoteIdent(void);
00186
00187
00188 aString & RequestMethod(void);
00189
00190 aString & RemoteUser(void);
00191
00192 aString & ScriptName(void);
00193
00194 aString & ServerName(void);
00195
00196 aString & ServerPort(void);
00197
00198 aString & ServerProtocol(void);
00199
00200 aString & ServerSoftware(void);
00201
00202 aString & ContentBoundary(void);
00203
00204 cgiInput & ClientArguments( void );
00205
00206 };
00207
00208
00209
00210
00211
00212
00213
00214 class cgiBase : public ostream
00215 {
00216
00217 protected:
00218 cgiObjectId id;
00219 aString opening;
00220 aString close;
00221 aString endLine;
00222
00223 public:
00224
00225 cgiBase();
00226 cgiBase(cgiBase& input);
00227 const char * tag( void );
00228 virtual ~cgiBase();
00229 };
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241 class cgiScriptLite: public cgiBase
00242 {
00243 protected:
00244 aString mimeType;
00245
00246 public:
00247 cgiScriptLite( const char * mimeString = "text/html", bool bCloseHeader=true );
00248 void closeHeader( void );
00249 ~cgiScriptLite();
00250 void Redirect( const char * location );
00251 };
00252
00253
00254
00255
00256
00257
00258
00259
00260 class cgiScript: public cgiEnvironment, public cgiScriptLite
00261 {
00262 public:
00263 cgiScript( const char * mimeString = "text/html",
00264 bool bCloseHeader = true,
00265 const char * uploadPath = NULL );
00266 ~cgiScript();
00267 cgiScript & DebugString( void );
00268 };
00269
00270
00271
00272
00273
00274
00275 class cgiHtml : public cgiBase
00276 {
00277
00278 public:
00279
00280 cgiHtml( char * attr = "");
00281 virtual ~cgiHtml();
00282
00283 };
00284
00285
00286
00287
00288
00289
00290 class cgiHead : public cgiBase
00291 {
00292
00293 public:
00294
00295 cgiHead( char * attr = "");
00296 virtual ~cgiHead();
00297
00298 };
00299
00300
00301
00302
00303
00304
00305 class cgiBody : public cgiBase {
00306
00307 public:
00308
00309 cgiBody(char * attr = "");
00310 virtual ~cgiBody();
00311
00312 };
00313
00314 #endif // sentry
00315
00316 #ifdef IN_T2_TESTHARNESS
00317
00318
00319
00320 cgiScript script;
00321 {
00322
00323 cgiHtml html;
00324 {
00325
00326 cgiHead head;
00327 {
00328 cgiCan title("title");
00329 title << "T2 test code";
00330 }
00331 {
00332 cgiCan style("style");
00333 style << ".odd{ color: navy; background: white;}\n"
00334 << ".even{ color: white; background: navy;}\n"
00335 << ".cookie{ color: green; background: tan; }\n";
00336 }
00337 }
00338 {
00339
00340 cgiBody body;
00341 body << "<h1>The test harness</h1>" << endl;
00342 {
00343 cgiCan div("div"," class='odd'" );
00344 div << "This is an odd div block" << endl;
00345 }
00346 {
00347 cgiCan div("div", " class='even'" );
00348 div << "This is an even div block.\n";
00349 }
00350 {
00351 cgiCan div("div"," class='odd'" );
00352 div << "<h4>See if anybody typed:?question=...</h4>" << endl;
00353 div << "count = " << script.ClientArguments().count("question") << "<br>" << endl;
00354 div << "variable = " << script.ClientArguments()["question"].str() << "<br>" << endl;
00355
00356 }
00357 }
00358 }
00359
00360 #endif
00361
00362