summaryrefslogtreecommitdiff
path: root/project2/cgi
diff options
context:
space:
mode:
authorrandomdan <randomdan@localhost>2011-09-02 15:17:00 +0000
committerrandomdan <randomdan@localhost>2011-09-02 15:17:00 +0000
commit1a92dbf8d8ce0e97fdd914f35cf34579e1802db8 (patch)
treef0d633245ae54d013a9efbc39d775ffe27d94633 /project2/cgi
parentAllow low preference caches to refill higher ones (diff)
downloadproject2-1a92dbf8d8ce0e97fdd914f35cf34579e1802db8.tar.bz2
project2-1a92dbf8d8ce0e97fdd914f35cf34579e1802db8.tar.xz
project2-1a92dbf8d8ce0e97fdd914f35cf34579e1802db8.zip
Minor shuffle
Add referer support in cURL things Add support for redirects in cgi views
Diffstat (limited to 'project2/cgi')
-rw-r--r--project2/cgi/cgiAppEngine.cpp9
-rw-r--r--project2/cgi/cgiHttpHeader.cpp6
-rw-r--r--project2/cgi/cgiHttpHeader.h1
-rw-r--r--project2/cgi/cgiStagePresent.cpp12
-rw-r--r--project2/cgi/cgiStageRedirect.cpp49
5 files changed, 66 insertions, 11 deletions
diff --git a/project2/cgi/cgiAppEngine.cpp b/project2/cgi/cgiAppEngine.cpp
index 4978c0c..2c4feb0 100644
--- a/project2/cgi/cgiAppEngine.cpp
+++ b/project2/cgi/cgiAppEngine.cpp
@@ -41,15 +41,6 @@ CgiApplicationEngine::env() const
return _env;
}
-class TransformXmlToHttpStream : public TransformImpl<xmlpp::Document, ostreamWrapper> {
- public:
- void transform(const xmlpp::Document * doc, ostreamWrapper * o) const
- {
- const_cast<xmlpp::Document *>(doc)->write_to_stream_formatted(o->strm, "UTF-8");
- }
-};
-DECLARE_TRANSFORM(TransformXmlToHttpStream);
-
void
CgiApplicationEngine::process() const
{
diff --git a/project2/cgi/cgiHttpHeader.cpp b/project2/cgi/cgiHttpHeader.cpp
index e82a882..20b20ea 100644
--- a/project2/cgi/cgiHttpHeader.cpp
+++ b/project2/cgi/cgiHttpHeader.cpp
@@ -2,6 +2,12 @@
#include "cgiHttpHeader.h"
#include <boost/foreach.hpp>
+Project2HttpHeader::Project2HttpHeader(const std::string & s) :
+ cgicc::HTTPHeader("")
+{
+ addHeader("Status", s);
+}
+
Project2HttpHeader::Project2HttpHeader(const std::string & s, const std::string & t) :
cgicc::HTTPHeader("")
{
diff --git a/project2/cgi/cgiHttpHeader.h b/project2/cgi/cgiHttpHeader.h
index f84c707..87edde5 100644
--- a/project2/cgi/cgiHttpHeader.h
+++ b/project2/cgi/cgiHttpHeader.h
@@ -9,6 +9,7 @@
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;
diff --git a/project2/cgi/cgiStagePresent.cpp b/project2/cgi/cgiStagePresent.cpp
index fffcaa7..df05465 100644
--- a/project2/cgi/cgiStagePresent.cpp
+++ b/project2/cgi/cgiStagePresent.cpp
@@ -17,8 +17,16 @@ CgiApplicationEngine::NextStage
CgiApplicationEngine::PresentStage::run()
{
runChecks();
- executeViews(boost::bind(&PresenterLoader::createFrom, LoaderBase::getLoader<PresenterLoader, NotSupported>(e->defaultPresenter), _1));
- return NextStage(NULL, this, boost::dynamic_pointer_cast<TransformSource>(headPresenter()), headPresenter());
+ try {
+ executeViews(boost::bind(&PresenterLoader::createFrom, LoaderBase::getLoader<PresenterLoader, NotSupported>(e->defaultPresenter), _1));
+ return NextStage(NULL, this, boost::dynamic_pointer_cast<TransformSource>(headPresenter()), headPresenter());
+ }
+ catch (ResponseStagePtr p) {
+ return NextStage(NULL, p, boost::dynamic_pointer_cast<TransformSource>(p), boost::dynamic_pointer_cast<Presenter>(p));
+ }
+ catch (StagePtr p) {
+ return NextStage(p, NULL, boost::dynamic_pointer_cast<TransformSource>(p), boost::dynamic_pointer_cast<Presenter>(p));
+ }
}
CgiApplicationEngine::ResponseStage::ResponseStage(const CgiEnvironment * e) :
diff --git a/project2/cgi/cgiStageRedirect.cpp b/project2/cgi/cgiStageRedirect.cpp
new file mode 100644
index 0000000..af938c0
--- /dev/null
+++ b/project2/cgi/cgiStageRedirect.cpp
@@ -0,0 +1,49 @@
+#include <pch.hpp>
+#include "cgiAppEngine.h"
+#include "cgiEnvironment.h"
+#include "cgiHttpHeader.h"
+#include "logger.h"
+
+namespace CgiApplicationExtras {
+ class RedirectStage : public CgiApplicationEngine::ResponseStage {
+ public:
+ RedirectStage(const CgiEnvironment * env, const std::string & u) :
+ ResponseStage(env),
+ url(u) {
+ }
+
+ CgiApplicationEngine::HttpHeaderPtr getHeader() const
+ {
+ Project2HttpHeader * header = new Project2HttpHeader("301 Moved Permanently");
+ header->addHeader("Location", url);
+ return CgiApplicationEngine::HttpHeaderPtr(header);
+ }
+
+ CgiApplicationEngine::NextStage run()
+ {
+ return CgiApplicationEngine::NextStage(NULL, this, NULL, NULL);
+ }
+ private:
+ const std::string url;
+ };
+
+ class CgiRedirect : public View {
+ public:
+ CgiRedirect(const xmlpp::Element * e) :
+ SourceObject(e),
+ View(e),
+ url(e, "url", true) {
+ }
+ void loadComplete(const CommonObjects *) {
+ }
+ void execute(const Presenter *) const {
+ throw CgiApplicationEngine::ResponseStagePtr(
+ new RedirectStage(dynamic_cast<const CgiEnvironment *>(Environment::getCurrent()), url()));
+ }
+ private:
+ Variable url;
+ };
+}
+
+typedef CgiApplicationExtras::CgiRedirect cgird;
+DECLARE_LOADER("cgiredirect", cgird);