summaryrefslogtreecommitdiff
path: root/project2/cgi
diff options
context:
space:
mode:
authorrandomdan <randomdan@localhost>2012-01-01 04:26:45 +0000
committerrandomdan <randomdan@localhost>2012-01-01 04:26:45 +0000
commit4c53ec26519716e086e67796dc15a0e7dce70bd0 (patch)
tree9b938a3d4f289a42b3543ac4327bc9f5ea644aba /project2/cgi
parentRemove useless typedef requiring extra template parameter (diff)
downloadproject2-4c53ec26519716e086e67796dc15a0e7dce70bd0.tar.bz2
project2-4c53ec26519716e086e67796dc15a0e7dce70bd0.tar.xz
project2-4c53ec26519716e086e67796dc15a0e7dce70bd0.zip
Regeneralise some code
Fully customisable output chain Minor supporting tweaks here and there
Diffstat (limited to 'project2/cgi')
-rw-r--r--project2/cgi/cgiAppEngine.cpp44
-rw-r--r--project2/cgi/cgiAppEngine.h9
-rw-r--r--project2/cgi/cgiHttpHeader.cpp7
-rw-r--r--project2/cgi/cgiHttpHeader.h1
-rw-r--r--project2/cgi/cgiStageCustomError.cpp4
-rw-r--r--project2/cgi/cgiStageCustomNotFound.cpp4
-rw-r--r--project2/cgi/cgiStageDefaultError.cpp2
-rw-r--r--project2/cgi/cgiStageDefaultNotFound.cpp2
-rw-r--r--project2/cgi/cgiStagePresent.cpp22
-rw-r--r--project2/cgi/cgiStageRequest.cpp9
10 files changed, 74 insertions, 30 deletions
diff --git a/project2/cgi/cgiAppEngine.cpp b/project2/cgi/cgiAppEngine.cpp
index 8d079f9..8093ef3 100644
--- a/project2/cgi/cgiAppEngine.cpp
+++ b/project2/cgi/cgiAppEngine.cpp
@@ -4,7 +4,6 @@
#include <cgicc/HTTPHeader.h>
#include "cgiEnvironment.h"
#include "iterate.h"
-#include "logger.h"
#include <boost/bind.hpp>
#include <boost/foreach.hpp>
#include "ostreamWrapper.h"
@@ -44,6 +43,43 @@ CgiApplicationEngine::env() const
return _env;
}
+class CgiResult : public TransformChainLink {
+ public:
+ CgiResult(CgiApplicationEngine::HttpHeaderPtr & h, std::ostream & s) :
+ header(h),
+ stream(s) {
+ }
+ CgiApplicationEngine::HttpHeaderPtr header;
+ std::ostream & stream;
+};
+
+class WriteToCgiResult : public TransformImpl<WritableContent, CgiResult> {
+ public:
+ void transform(const WritableContent * wc, CgiResult * cr) const {
+ cr->header->addHeader("Content-Type", wc->getContentType());
+ cr->header->render(cr->stream);
+ wc->writeTo(cr->stream);
+ }
+};
+DECLARE_TRANSFORM(WriteToCgiResult);
+
+bool
+addFinalTransformTarget(TransformSourcePtr ts, TransformChainLink * tcl)
+{
+ if (ts->getTargets().empty()) {
+ ts->addTarget(tcl, NULL);
+ return true;
+ }
+ BOOST_FOREACH(const Targets::value_type & t, ts->getTargets()) {
+ if (TransformSource * tr = dynamic_cast<TransformSource *>(t.first.get())) {
+ if (addFinalTransformTarget(tr, tcl)) {
+ return true;
+ }
+ }
+ }
+ return false;
+}
+
void
CgiApplicationEngine::process() const
{
@@ -89,9 +125,9 @@ CgiApplicationEngine::process() const
header->setCookie(cgicc::HTTPCookie(SESSIONID, cursession->ID.str(), "Session ID",
_env->getServerName().substr(_env->getServerName().find(".")), env()->sessionTimeOut, "/", false));
}
- header->render(IO);
if (currentStage.get<2>()) {
TransformSourcePtr ts = currentStage.get<2>();
+ addFinalTransformTarget(ts, new CgiResult(header, IO));
std::fstream * ddd = NULL;
if (!_env->dumpdatadoc.empty()) {
ddd = new std::fstream(_env->dumpdatadoc.c_str(), std::fstream::trunc | std::fstream::out);
@@ -99,12 +135,14 @@ CgiApplicationEngine::process() const
ts->addTarget(new ostreamWrapper(*ddd));
}
}
- ts->addTarget(new ostreamWrapper(IO));
ts->doTransforms();
if (ddd) {
delete ddd;
}
}
+ else {
+ header->render(IO);
+ }
}
CgiApplicationEngine::Stage::Stage(const CgiEnvironment * env) :
diff --git a/project2/cgi/cgiAppEngine.h b/project2/cgi/cgiAppEngine.h
index e339576..80dad6e 100644
--- a/project2/cgi/cgiAppEngine.h
+++ b/project2/cgi/cgiAppEngine.h
@@ -13,6 +13,7 @@
#include <boost/intrusive_ptr.hpp>
#include <boost/tuple/tuple.hpp>
#include "cgiOutputOptions.h"
+#include "cgiHttpHeader.h"
class CgiEnvironment;
class Session;
@@ -23,7 +24,7 @@ namespace cgicc {
class CgiApplicationEngine : public ApplicationEngine, public TransformChainLink {
public:
- typedef boost::shared_ptr<cgicc::HTTPHeader> HttpHeaderPtr;
+ typedef boost::shared_ptr<Project2HttpHeader> HttpHeaderPtr;
CgiApplicationEngine(const CgiEnvironment *, std::ostream &);
virtual ~CgiApplicationEngine();
@@ -94,9 +95,13 @@ class CgiApplicationEngine : public ApplicationEngine, public TransformChainLink
class PresentStage : public virtual ResponseStage, ViewHost {
public:
PresentStage(const CgiEnvironment * e, ScriptReaderPtr);
-
+ MultiRowSetPresenterPtr getPresenter() const;
+
virtual NextStage run();
virtual HttpHeaderPtr getHeader() const;
+ protected:
+ mutable MultiRowSetPresenterPtr presenter;
+ ScriptNodePtr root;
};
/// The built-in fail-safe not found stage
diff --git a/project2/cgi/cgiHttpHeader.cpp b/project2/cgi/cgiHttpHeader.cpp
index 20b20ea..b71a647 100644
--- a/project2/cgi/cgiHttpHeader.cpp
+++ b/project2/cgi/cgiHttpHeader.cpp
@@ -8,13 +8,6 @@ Project2HttpHeader::Project2HttpHeader(const std::string & s) :
addHeader("Status", s);
}
-Project2HttpHeader::Project2HttpHeader(const std::string & s, const std::string & t) :
- cgicc::HTTPHeader("")
-{
- addHeader("Status", s);
- addHeader("Content-Type", t);
-}
-
void
Project2HttpHeader::addHeader(const std::string & name, const Glib::ustring & value)
{
diff --git a/project2/cgi/cgiHttpHeader.h b/project2/cgi/cgiHttpHeader.h
index 87edde5..ffa5e70 100644
--- a/project2/cgi/cgiHttpHeader.h
+++ b/project2/cgi/cgiHttpHeader.h
@@ -10,7 +10,6 @@ class Project2HttpHeader : public cgicc::HTTPHeader {
public:
typedef std::map<std::string, const Glib::ustring> Headers;
Project2HttpHeader(const std::string & s);
- Project2HttpHeader(const std::string & s, const std::string & t);
void addHeader(const std::string & name, const Glib::ustring & value);
void render(std::ostream & out) const;
private:
diff --git a/project2/cgi/cgiStageCustomError.cpp b/project2/cgi/cgiStageCustomError.cpp
index 82fc6a1..eb66ff0 100644
--- a/project2/cgi/cgiStageCustomError.cpp
+++ b/project2/cgi/cgiStageCustomError.cpp
@@ -6,8 +6,8 @@
CgiApplicationEngine::CustomErrorStage::CustomErrorStage(const CgiEnvironment * env, const std::exception & ex, ScriptReaderPtr s) :
CgiApplicationEngine::ResponseStage(env),
- ::CommonObjects(s),
- ::CheckHost(s),
+ ::CommonObjects(s->root()),
+ ::CheckHost(s->root()),
CgiApplicationEngine::DefaultErrorStage(env, ex),
CgiApplicationEngine::PresentStage(env, s)
{
diff --git a/project2/cgi/cgiStageCustomNotFound.cpp b/project2/cgi/cgiStageCustomNotFound.cpp
index 8a224fa..e6520dd 100644
--- a/project2/cgi/cgiStageCustomNotFound.cpp
+++ b/project2/cgi/cgiStageCustomNotFound.cpp
@@ -6,8 +6,8 @@
CgiApplicationEngine::CustomNotFoundStage::CustomNotFoundStage(const CgiEnvironment * env, const ScriptNotFound & notfound, ScriptReaderPtr s) :
CgiApplicationEngine::ResponseStage(env),
- ::CommonObjects(s),
- ::CheckHost(s),
+ ::CommonObjects(s->root()),
+ ::CheckHost(s->root()),
CgiApplicationEngine::DefaultNotFoundStage(env, notfound),
CgiApplicationEngine::PresentStage(env, s)
{
diff --git a/project2/cgi/cgiStageDefaultError.cpp b/project2/cgi/cgiStageDefaultError.cpp
index ad27d2d..e464981 100644
--- a/project2/cgi/cgiStageDefaultError.cpp
+++ b/project2/cgi/cgiStageDefaultError.cpp
@@ -23,7 +23,7 @@ CgiApplicationEngine::DefaultErrorStage::~DefaultErrorStage()
CgiApplicationEngine::HttpHeaderPtr
CgiApplicationEngine::DefaultErrorStage::getHeader() const
{
- return HttpHeaderPtr(new Project2HttpHeader("500 Internal Server Error", pres->contentType));
+ return HttpHeaderPtr(new Project2HttpHeader("500 Internal Server Error"));
}
CgiApplicationEngine::NextStage
diff --git a/project2/cgi/cgiStageDefaultNotFound.cpp b/project2/cgi/cgiStageDefaultNotFound.cpp
index be32658..2cf0475 100644
--- a/project2/cgi/cgiStageDefaultNotFound.cpp
+++ b/project2/cgi/cgiStageDefaultNotFound.cpp
@@ -17,7 +17,7 @@ CgiApplicationEngine::DefaultNotFoundStage::DefaultNotFoundStage(const CgiEnviro
CgiApplicationEngine::HttpHeaderPtr
CgiApplicationEngine::DefaultNotFoundStage::getHeader() const
{
- return HttpHeaderPtr(new Project2HttpHeader("404 Not found", pres->contentType));
+ return HttpHeaderPtr(new Project2HttpHeader("404 Not found"));
}
CgiApplicationEngine::NextStage
diff --git a/project2/cgi/cgiStagePresent.cpp b/project2/cgi/cgiStagePresent.cpp
index 8eb0487..1330cdc 100644
--- a/project2/cgi/cgiStagePresent.cpp
+++ b/project2/cgi/cgiStagePresent.cpp
@@ -7,11 +7,13 @@
CgiApplicationEngine::PresentStage::PresentStage(const CgiEnvironment * e, ScriptReaderPtr s) :
CgiApplicationEngine::ResponseStage(e),
- CommonObjects(s),
- CheckHost(s),
- ViewHost(s)
+ CommonObjects(s->root()),
+ CheckHost(s->root()),
+ ViewHost(s->root()),
+ root(s->root())
{
s->loader.addLoadTarget(s->root(), Storer::into<OutputOptionsLoader>(&outputOptions));
+ s->loader.addLoadTarget(s->root(), Storer::into<PresenterLoader>(&presenter));
}
CgiApplicationEngine::NextStage
@@ -19,7 +21,7 @@ CgiApplicationEngine::PresentStage::run()
{
runChecks();
try {
- executeViews(boost::bind(&PresenterLoader::createFrom, LoaderBase::getLoader<PresenterLoader, NotSupported>(e->defaultPresenter), _1));
+ executeViews();
return NextStage(NULL, this, boost::dynamic_pointer_cast<TransformSource>(presenter), presenter);
}
catch (ResponseStagePtr p) {
@@ -30,6 +32,15 @@ CgiApplicationEngine::PresentStage::run()
}
}
+MultiRowSetPresenterPtr
+CgiApplicationEngine::PresentStage::getPresenter() const
+{
+ if (!presenter) {
+ presenter = LoaderBase::getLoader<PresenterLoader, NotSupported>(e->defaultPresenter)->createFrom(root);
+ }
+ return presenter;
+}
+
CgiApplicationEngine::ResponseStage::ResponseStage(const CgiEnvironment * e) :
CgiApplicationEngine::Stage(e)
{
@@ -38,8 +49,7 @@ CgiApplicationEngine::ResponseStage::ResponseStage(const CgiEnvironment * e) :
CgiApplicationEngine::HttpHeaderPtr
CgiApplicationEngine::PresentStage::getHeader() const
{
- const ContentPresenter * cp = dynamic_cast<const ContentPresenter *>(presenter.get());
- Project2HttpHeader * header = new Project2HttpHeader("200 OK", cp ? cp->contentType : "text/plain; charset=UTF-8");
+ Project2HttpHeader * header = new Project2HttpHeader("200 OK");
header->addHeader("Cache-control", "no-cache");
return HttpHeaderPtr(header);
}
diff --git a/project2/cgi/cgiStageRequest.cpp b/project2/cgi/cgiStageRequest.cpp
index ac8516b..d505f3c 100644
--- a/project2/cgi/cgiStageRequest.cpp
+++ b/project2/cgi/cgiStageRequest.cpp
@@ -7,10 +7,10 @@
CgiApplicationEngine::RequestStage::RequestStage(const CgiEnvironment * e, ScriptReaderPtr s) :
SourceObject(s->root()),
- CommonObjects(s),
- ::CheckHost(s),
+ CommonObjects(s->root()),
+ ::CheckHost(s->root()),
CgiApplicationEngine::ResponseStage(e),
- ::TaskHost(s),
+ ::TaskHost(s->root()),
present(s->root()->value("present","").as<std::string>())
{
}
@@ -23,11 +23,10 @@ CgiApplicationEngine::RequestStage::run()
return NextStage(present.empty() ? NULL : new PresentStage(e, e->resolveScript(e->presentRoot, present, false)), this);
}
-const std::string contentType = "text/plain";
CgiApplicationEngine::HttpHeaderPtr
CgiApplicationEngine::RequestStage::getHeader() const
{
- Project2HttpHeader * header = new Project2HttpHeader("200 OK", contentType);
+ Project2HttpHeader * header = new Project2HttpHeader("200 OK");
header->addHeader("Cache-control", "no-cache");
return HttpHeaderPtr(header);
}