00001
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
00033 enum cgiObjectId { cgi, html, head, body, generic};
00034
00035
00036
00038 class cgiEnvironment;
00042 typedef map < string, aString > queryStringMap;
00043
00051 class cgiInput
00052 {
00057 private:
00058 queryStringMap theMap;
00059 ocFiles fileMap;
00060 aString safe;
00061 protected:
00062 aString uploadPath;
00063 public:
00064
00065
00066 public:
00073 cgiInput();
00074 ~cgiInput();
00078 void set( const char * boundaryString, size_t size = 0 );
00085 void setMultipart( aString boundary );
00089 aString & Safe(void);
00092 queryStringMap & TheMap(void);
00095 ocFiles & FileMap(void);
00096
00098 int count( const char * key );
00100 aString & operator [] ( const char * key );
00101 friend class cgiEnvironment;
00102 };
00103
00114 class cgiEnvironment
00115 {
00130 private:
00131
00132 aString contentLength;
00133 aString contentType;
00134 aString contentBoundary;
00135 aString gatewayInterface;
00136 aString httpAccept;
00137 aString httpUserAgent;
00138 aString httpReferer;
00139 aString pathInfo;
00140 aString pathTranslated;
00141 aString queryString;
00142 aString remoteAddr;
00143 aString remoteHost;
00144 aString remoteIdent;
00145 aString requestMethod;
00146 aString remoteUser;
00147 aString scriptName;
00148 aString serverName;
00149 aString serverPort;
00150 aString serverProtocol;
00151 aString serverSoftware;
00152 cgiInput clientArguments;
00153 int contentSize;
00154
00156 static bool readOnCreateMode;
00157
00158 public:
00165 cgiEnvironment(const char * uploadPath = NULL);
00166 ~cgiEnvironment();
00167
00169 aString & ContentLength(void);
00171 aString & ContentType(void);
00173 aString & GatewayInterface(void);
00175 aString & HttpAccept(void);
00177 aString & HttpUserAgent(void);
00179 aString & HttpReferer(void);
00180
00182 aString & PathInfo(void);
00185 aString & PathTranslated(void);
00187 aString & QueryString(void);
00189 aString & RemoteAddr(void);
00191 aString & RemoteHost(void);
00194 aString & RemoteIdent(void);
00197 aString & RequestMethod(void);
00199 aString & RemoteUser(void);
00201 aString & ScriptName(void);
00203 aString & ServerName(void);
00205 aString & ServerPort(void);
00207 aString & ServerProtocol(void);
00209 aString & ServerSoftware(void);
00211 aString & ContentBoundary(void);
00213 cgiInput & ClientArguments( void );
00215 static void ReadOnCreateMode( bool doRead );
00217 bool readInput( void );
00218
00219 };
00220
00221
00227 class cgiBase : public ostream
00228 {
00229
00230 protected:
00231 cgiObjectId id;
00232 aString opening;
00233 aString close;
00234 aString endLine;
00235
00236 public:
00237
00238 cgiBase();
00239 cgiBase(cgiBase& input);
00240 const char * tag( void );
00241 virtual ~cgiBase();
00242 };
00243
00244
00245
00254 class cgiScriptLite: public cgiBase
00255 {
00256 protected:
00257 aString mimeType;
00258
00259 public:
00260 cgiScriptLite( const char * mimeString = "text/html", bool bCloseHeader=true , bool bCache = false);
00261 void openHeader( const char * mimeString = NULL );
00262 void closeHeader( void );
00263 ~cgiScriptLite();
00264 void Redirect( const char * location );
00265 };
00266
00267
00274 class cgiScript: public cgiEnvironment, public cgiScriptLite
00275 {
00276 public:
00277 cgiScript( const char * mimeString = "text/html",
00278 bool bCloseHeader = true,
00279 const char * uploadPath = NULL,
00280 bool bCache = false );
00281 ~cgiScript();
00282 cgiScript & DebugString( void );
00283 };
00284
00290 class cgiHtml : public cgiBase
00291 {
00292
00293 public:
00294
00295 cgiHtml( char * attr = "");
00296 virtual ~cgiHtml();
00297
00298 };
00299
00305 class cgiHead : public cgiBase
00306 {
00307
00308 public:
00309
00310 cgiHead( char * attr = "");
00311 virtual ~cgiHead();
00312
00313 };
00314
00320 class cgiBody : public cgiBase {
00321
00322 public:
00323
00324 cgiBody(char * attr = "");
00325 virtual ~cgiBody();
00326
00327 };
00328
00329 #endif // sentry
00330
00331 #ifdef IN_T2_TESTHARNESS
00332
00333
00334 {
00335
00336 cgiEnvironment::ReadOnCreateMode(false);
00337
00338
00339 cgiScript script("text/html",false);
00340 {
00341 script.closeHeader();
00342
00343 cgiHtml html;
00344 {
00345
00346 cgiHead head;
00347 {
00348 cgiCan title("title");
00349 title << "T2 test code";
00350 }
00351 {
00352 cgiCan style("style");
00353 style << "div.form{ color: navy; background: white; border: navy 1px #645; }\n";
00354 }
00355 }
00356 {
00357
00358 cgiBody body;
00359 body << "<h1>The form test</h1>" << endl;
00360 body << "<p>Content Length " << script.ContentLength() << "</p>\r\n\r\n" << endl;
00361 {
00362 cgiCan div("div"," class='form'" );
00363 div << "<h4>See if anybody typed:?file=...</h4>" << endl;
00364 {
00365 cgiCan form("form", "action='' encType='multipart/form-data' method='post'");
00366 form << "<input type='file' name='file'>" << endl;
00367 form << "<input type='submit' value='Upload'>" << endl;
00368 }
00369 div << "count = " << script.ClientArguments().count("file") << "<br>" << endl;
00370 div << "variable = " << script.ClientArguments()["file"].str() << "<br>" << endl;
00371 script.readInput();
00372 div << "<h4>DONE</h4>" << endl;
00373 }
00374 }
00375 }
00376
00377 }
00379 #endif
00380
00381