diff options
| -rw-r--r-- | project2/cgi/FCgiIO.cpp | 79 | ||||
| -rw-r--r-- | project2/cgi/FCgiIO.h | 24 | ||||
| -rw-r--r-- | project2/cgi/cgiCommon.cpp | 4 | ||||
| -rw-r--r-- | project2/cgi/cgiCommon.h | 2 | ||||
| -rw-r--r-- | project2/cgi/cgiEnvInput.h | 11 | ||||
| -rw-r--r-- | project2/cgi/cgiEnvironment.cpp | 3 | ||||
| -rw-r--r-- | project2/cgi/cgiEnvironment.h | 4 | ||||
| -rw-r--r-- | project2/cgi/p2webCgi.cpp | 13 | ||||
| -rw-r--r-- | project2/cgi/p2webFCgi.cpp | 2 | ||||
| -rw-r--r-- | project2/cgi/testCgi.cpp | 9 | 
10 files changed, 100 insertions, 51 deletions
diff --git a/project2/cgi/FCgiIO.cpp b/project2/cgi/FCgiIO.cpp index 8d52a77..e47b62e 100644 --- a/project2/cgi/FCgiIO.cpp +++ b/project2/cgi/FCgiIO.cpp @@ -28,37 +28,66 @@  #include <iostream>  #include <stdexcept>  #include <cstdlib> +#include "safeMapFind.h"  #include "FCgiIO.h" -cgicc::FCgiIO::FCgiIO(FCGX_Request& request) -  : std::ostream(&fOutBuf), -	 fRequest(request),  -	 fOutBuf(request.out),  -	 fErrBuf(request.err),  -	 fErr(&fErrBuf) +cgicc::FCgiIO::FCgiIO(FCGX_Request& request) : +	std::ostream(&fOutBuf), +	fRequest(request),  +	fOutBuf(request.out),  +	fErrBuf(request.err),  +	fErr(&fErrBuf)  { -  rdbuf(&fOutBuf); -  fErr.rdbuf(&fErrBuf); +	rdbuf(&fOutBuf); +	fErr.rdbuf(&fErrBuf); -  // Parse environment -  for(char **e = fRequest.envp; *e != NULL; ++e) { -    std::string s(*e); -    std::string::size_type i = s.find('='); -    if(i == std::string::npos) -      throw std::runtime_error("Illegally formed environment"); -    fEnv[s.substr(0, i)] = s.substr(i + 1); -  } +	// Parse environment +	for(char **e = fRequest.envp; *e != NULL; ++e) { +		std::string s(*e); +		std::string::size_type i = s.find('='); +		if(i == std::string::npos) +			throw std::runtime_error("Illegally formed environment"); +		fEnv[s.substr(0, i)] = s.substr(i + 1); +	}  } -cgicc::FCgiIO::FCgiIO(const FCgiIO& io) -  : std::ios(), -    CgiInput(io), -		std::ostream(&fOutBuf), -	 fRequest(io.fRequest),  -	 fErr(&fErrBuf),  -	 fEnv(io.fEnv) +cgicc::FCgiIO::FCgiIO(const FCgiIO& io) : +	std::ios(), +	CgiInput(io), +	std::ostream(&fOutBuf), +	fRequest(io.fRequest),  +	fErr(&fErrBuf),  +	fEnv(io.fEnv)  { -  rdbuf(&fOutBuf); -  fErr.rdbuf(&fErrBuf); +	rdbuf(&fOutBuf); +	fErr.rdbuf(&fErrBuf); +} + +cgicc::FCgiIO::~FCgiIO() +{ +} + +size_t +cgicc::FCgiIO::read(char *data, size_t length) +{ +	return FCGX_GetStr(data, length, fRequest.in); +} + +std::string +cgicc::FCgiIO::getenv(const char *varName) +{ +	return fEnv[varName]; +} + +std::string +cgicc::FCgiIO::getenv(const std::string & varName) const +{ +	return defaultMapFind(fEnv, varName, ""); +} + +std::ostream & +cgicc::FCgiIO::err() +{ +	return fErr;  } diff --git a/project2/cgi/FCgiIO.h b/project2/cgi/FCgiIO.h index a8b67f3..7811fac 100644 --- a/project2/cgi/FCgiIO.h +++ b/project2/cgi/FCgiIO.h @@ -45,7 +45,7 @@  #include <map>  #include "fcgio.h" - +#include "cgiEnvInput.h"  #include "cgicc/CgiInput.h"  namespace cgicc { @@ -64,7 +64,7 @@ namespace cgicc {     * It also provides access to the request's output and error streams, using a     * similar interface.     */ -  class CGICC_API FCgiIO : public cgicc::CgiInput, public std::ostream +  class CGICC_API FCgiIO : public cgicc::CgiInput, public CgiEnvInput, public std::ostream    {    public: @@ -91,9 +91,7 @@ namespace cgicc {       *       * Delete this FCgiIO object       */ -    virtual inline -    ~FCgiIO() -    {} +    virtual ~FCgiIO();      //@}      // ============================================================ @@ -108,10 +106,7 @@ namespace cgicc {       * \param length The number of characters to read       * \return The number of characters read       */ -    virtual inline size_t read(char *data, size_t length) -    { -      return FCGX_GetStr(data, length, fRequest.in); -    } +    virtual size_t read(char *data, size_t length);      /*!       * \brief Query the value of an environment variable stored in the request. @@ -120,10 +115,8 @@ namespace cgicc {       * \return The value of the requested environment variable, or an empty       * string if not found.       */ -    virtual inline std::string getenv(const char *varName) -    { -      return fEnv[varName]; -    } +    virtual std::string getenv(const char *varName); +    virtual std::string getenv(const std::string & varName) const;      //@}      // ============================================================ @@ -134,10 +127,7 @@ namespace cgicc {      /*!       * \brief Provides access to the error stream.     */ -    inline std::ostream& err(void) -    { -      return fErr; -    } +    std::ostream& err();      //@}    protected: diff --git a/project2/cgi/cgiCommon.cpp b/project2/cgi/cgiCommon.cpp index ac3e6d4..60a9abf 100644 --- a/project2/cgi/cgiCommon.cpp +++ b/project2/cgi/cgiCommon.cpp @@ -37,10 +37,10 @@ doExceptionReporting(const E & e, std::ostream & IO)  }  void -cgiServe(cgicc::CgiInput * i, CgiEnvironment * env, std::ostream & IO) +cgiServe(cgicc::CgiInput * i, CgiEnvironment * env, std::ostream & IO, const CgiEnvInput * e)  {  	cgicc::Cgicc cgi(i); -	env->setCGICC(&cgi); +	env->setCGICC(&cgi, e);  	env->init();  	try {  		CgiApplicationEngine app(env, IO); diff --git a/project2/cgi/cgiCommon.h b/project2/cgi/cgiCommon.h index ce6108e..42a88e6 100644 --- a/project2/cgi/cgiCommon.h +++ b/project2/cgi/cgiCommon.h @@ -2,5 +2,5 @@  #include <cgicc/Cgicc.h>  #include "cgiEnvironment.h" -void cgiServe(cgicc::CgiInput * i, CgiEnvironment *, std::ostream & o); +void cgiServe(cgicc::CgiInput * i, CgiEnvironment *, std::ostream & o, const CgiEnvInput * e); diff --git a/project2/cgi/cgiEnvInput.h b/project2/cgi/cgiEnvInput.h new file mode 100644 index 0000000..2704fd5 --- /dev/null +++ b/project2/cgi/cgiEnvInput.h @@ -0,0 +1,11 @@ +#ifndef CGIENVINPUT +#define CGIENVINPUT + +#include <string> + +class CgiEnvInput { +	public: +    virtual std::string getenv(const std::string & varName) const = 0; +}; + +#endif diff --git a/project2/cgi/cgiEnvironment.cpp b/project2/cgi/cgiEnvironment.cpp index babeeea..a5d4af2 100644 --- a/project2/cgi/cgiEnvironment.cpp +++ b/project2/cgi/cgiEnvironment.cpp @@ -65,9 +65,10 @@ CgiEnvironment::~CgiEnvironment()  }  void -CgiEnvironment::setCGICC(const cgicc::Cgicc * c) +CgiEnvironment::setCGICC(const cgicc::Cgicc * c, const CgiEnvInput * e)  {  	cgi = c; +	cgienv = e;  	elems = makeVector(boost::filesystem::path(getRedirectURL()));  } diff --git a/project2/cgi/cgiEnvironment.h b/project2/cgi/cgiEnvironment.h index a2867be..be6732c 100644 --- a/project2/cgi/cgiEnvironment.h +++ b/project2/cgi/cgiEnvironment.h @@ -4,6 +4,7 @@  #include <string>  #include <vector>  #include "environment.h" +#include "cgiEnvInput.h"  #include <cgicc/CgiEnvironment.h>  SimpleMessageException(NoSuchCookie); @@ -38,8 +39,9 @@ class CgiEnvironment : public Environment {  		std::string getRequestMethod() const;  		std::string getCookieValue(const std::string & name) const; -		void setCGICC(const cgicc::Cgicc *); +		void setCGICC(const cgicc::Cgicc *, const CgiEnvInput * cgienv);  		const cgicc::Cgicc * cgi; +		const CgiEnvInput * cgienv;  		std::vector<std::string> elems;  	private: diff --git a/project2/cgi/p2webCgi.cpp b/project2/cgi/p2webCgi.cpp index 646d08b..80b5a98 100644 --- a/project2/cgi/p2webCgi.cpp +++ b/project2/cgi/p2webCgi.cpp @@ -2,12 +2,23 @@  #include "scriptLoader.h"  #include <boost/bind.hpp> +class GetEnv : public CgiEnvInput { +	public: +		std::string +		getenv(const std::string & varName) const +		{ +			const char * env = ::getenv(varName.c_str()); +			return env ? env : ""; +		} +}; +  int  main(void)  {  	LoaderBase::onAllComponents(boost::bind(&ComponentLoader::onBegin, _1));  	CgiEnvironment env; -	cgiServe(NULL, &env, std::cout); +	GetEnv ge; +	cgiServe(NULL, &env, std::cout, &ge);  	LoaderBase::onAllComponents(boost::bind(&ComponentLoader::onIteration, _1));  	LoaderBase::onAllComponents(boost::bind(&ComponentLoader::onPeriodic, _1));  	LoaderBase::onAllComponents(boost::bind(&ComponentLoader::onIdle, _1)); diff --git a/project2/cgi/p2webFCgi.cpp b/project2/cgi/p2webFCgi.cpp index a1786d2..7dac2cc 100644 --- a/project2/cgi/p2webFCgi.cpp +++ b/project2/cgi/p2webFCgi.cpp @@ -45,7 +45,7 @@ main(void)  		while (FCGX_Accept_r(&request) == 0) {  			alarm(0);  			cgicc::FCgiIO IO(request); -			cgiServe(&IO, &env, IO); +			cgiServe(&IO, &env, IO, &IO);  			alarm(60);  			LoaderBase::onAllComponents(boost::bind(&ComponentLoader::onIteration, _1));  			if (time(NULL) > lastPeriodic + periodicDelay) { diff --git a/project2/cgi/testCgi.cpp b/project2/cgi/testCgi.cpp index 1d3f72c..8a4ccb6 100644 --- a/project2/cgi/testCgi.cpp +++ b/project2/cgi/testCgi.cpp @@ -8,7 +8,7 @@  #define TESTOPT(name, def, desc) \  				(name, Options::value(optStore.insert(OptStore::value_type(name, StrPtr(new std::string()))).first->second.get(), def), desc) -class TestInput : public cgicc::CgiInput { +class TestInput : public cgicc::CgiInput, public CgiEnvInput {  	public:  		class TestConfigConsumer : public ConfigConsumer {  			public: @@ -67,6 +67,11 @@ class TestInput : public cgicc::CgiInput {  			return &opts;  		} +		std::string getenv(const std::string & varName) const +		{ +			StrPtr def(new std::string()); +			return *defaultMapFind(optStore, varName, def); +		}  		virtual std::string getenv(const char * varName)  		{  			StrPtr def(new std::string()); @@ -75,7 +80,7 @@ class TestInput : public cgicc::CgiInput {  		void run()  		{  			for (int run = 0; run < runCount; run += 1) { -				cgiServe(this, &env, std::cout); +				cgiServe(this, &env, std::cout, this);  			}  		}  | 
