diff options
author | randomdan <randomdan@localhost> | 2011-09-02 15:17:00 +0000 |
---|---|---|
committer | randomdan <randomdan@localhost> | 2011-09-02 15:17:00 +0000 |
commit | 1a92dbf8d8ce0e97fdd914f35cf34579e1802db8 (patch) | |
tree | f0d633245ae54d013a9efbc39d775ffe27d94633 /project2/cgi | |
parent | Allow low preference caches to refill higher ones (diff) | |
download | project2-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.cpp | 9 | ||||
-rw-r--r-- | project2/cgi/cgiHttpHeader.cpp | 6 | ||||
-rw-r--r-- | project2/cgi/cgiHttpHeader.h | 1 | ||||
-rw-r--r-- | project2/cgi/cgiStagePresent.cpp | 12 | ||||
-rw-r--r-- | project2/cgi/cgiStageRedirect.cpp | 49 |
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); |