summaryrefslogtreecommitdiff
path: root/project2/cgi/cgiStageFail.cpp
blob: a111a968dde92811a8ffbf01083aeaceadd2977c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <pch.hpp>
#include <boost/lexical_cast.hpp>
#include "cgiAppEngine.h"
#include "cgiRequestContext.h"
#include "cgiHttpHeader.h"
#include "logger.h"

namespace CgiApplicationExtras {
	class FailStage : public CgiApplicationEngine::ResponseStage {
		public:
			FailStage(int c, const std::string & m) :
				ResponseStage(NULL),
				code(c),
				message(m) {
			}

			CgiApplicationEngine::HttpHeaderPtr getHeader(CgiRequestContext *) const
			{
				Project2HttpHeader * header = new Project2HttpHeader(boost::lexical_cast<std::string>(code) + " " + message);
				return CgiApplicationEngine::HttpHeaderPtr(header);
			}

			CgiApplicationEngine::NextStage run(CgiRequestContext *)
			{
				return CgiApplicationEngine::NextStage(NULL, shared_from_this(), NULL, NULL);
			}
		private:
			const int code;
			const std::string message;
	};

	class CgiFail : public View {
		public:
			CgiFail(ScriptNodePtr e) :
				SourceObject(e),
				View(e),
				code(e, "code", 500),
				message(e, "message", "Application error") {
			}
			void execute(const MultiRowSetPresenter *, ExecContext * ec) const {
				throw CgiApplicationEngine::ResponseStagePtr(
						new FailStage(code(ec), message(ec)));
			}
		private:
			Variable code, message;
	};
}

NAMEDFACTORY("cgifail", CgiApplicationExtras::CgiFail, ViewFactory);