aboutsummaryrefslogtreecommitdiffstats
path: root/include/crow/http_response.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/crow/http_response.h')
-rw-r--r--include/crow/http_response.h129
1 files changed, 129 insertions, 0 deletions
diff --git a/include/crow/http_response.h b/include/crow/http_response.h
new file mode 100644
index 0000000..f5e03b4
--- /dev/null
+++ b/include/crow/http_response.h
@@ -0,0 +1,129 @@
+#pragma once
+#include <string>
+#include <unordered_map>
+
+#include "crow/json.h"
+#include "crow/http_request.h"
+#include "crow/ci_map.h"
+
+namespace crow
+{
+ template <typename Adaptor, typename Handler, typename ... Middlewares>
+ class Connection;
+ struct response
+ {
+ template <typename Adaptor, typename Handler, typename ... Middlewares>
+ friend class crow::Connection;
+
+ int code{200};
+ std::string body;
+ json::wvalue json_value;
+
+ // `headers' stores HTTP headers.
+ ci_map headers;
+
+ void set_header(std::string key, std::string value)
+ {
+ headers.erase(key);
+ headers.emplace(std::move(key), std::move(value));
+ }
+ void add_header(std::string key, std::string value)
+ {
+ headers.emplace(std::move(key), std::move(value));
+ }
+
+ const std::string& get_header_value(const std::string& key)
+ {
+ return crow::get_header_value(headers, key);
+ }
+
+
+ response() {}
+ explicit response(int code) : code(code) {}
+ response(std::string body) : body(std::move(body)) {}
+ response(json::wvalue&& json_value) : json_value(std::move(json_value))
+ {
+ json_mode();
+ }
+ response(int code, std::string body) : code(code), body(std::move(body)) {}
+ response(const json::wvalue& json_value) : body(json::dump(json_value))
+ {
+ json_mode();
+ }
+ response(int code, const json::wvalue& json_value) : code(code), body(json::dump(json_value))
+ {
+ json_mode();
+ }
+
+ response(response&& r)
+ {
+ *this = std::move(r);
+ }
+
+ response& operator = (const response& r) = delete;
+
+ response& operator = (response&& r) noexcept
+ {
+ body = std::move(r.body);
+ json_value = std::move(r.json_value);
+ code = r.code;
+ headers = std::move(r.headers);
+ completed_ = r.completed_;
+ return *this;
+ }
+
+ bool is_completed() const noexcept
+ {
+ return completed_;
+ }
+
+ void clear()
+ {
+ body.clear();
+ json_value.clear();
+ code = 200;
+ headers.clear();
+ completed_ = false;
+ }
+
+ void write(const std::string& body_part)
+ {
+ body += body_part;
+ }
+
+ void end()
+ {
+ if (!completed_)
+ {
+ completed_ = true;
+
+ if (complete_request_handler_)
+ {
+ complete_request_handler_();
+ }
+ }
+ }
+
+ void end(const std::string& body_part)
+ {
+ body += body_part;
+ end();
+ }
+
+ bool is_alive()
+ {
+ return is_alive_helper_ && is_alive_helper_();
+ }
+
+ private:
+ bool completed_{};
+ std::function<void()> complete_request_handler_;
+ std::function<bool()> is_alive_helper_;
+
+ //In case of a JSON object, set the Content-Type header
+ void json_mode()
+ {
+ set_header("Content-Type", "application/json");
+ }
+ };
+}