summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--project2/cgi/FCgiIO.cpp79
-rw-r--r--project2/cgi/FCgiIO.h24
-rw-r--r--project2/cgi/cgiCommon.cpp4
-rw-r--r--project2/cgi/cgiCommon.h2
-rw-r--r--project2/cgi/cgiEnvInput.h11
-rw-r--r--project2/cgi/cgiEnvironment.cpp3
-rw-r--r--project2/cgi/cgiEnvironment.h4
-rw-r--r--project2/cgi/p2webCgi.cpp13
-rw-r--r--project2/cgi/p2webFCgi.cpp2
-rw-r--r--project2/cgi/testCgi.cpp9
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);
}
}