37 #ifndef CLOE_HANDLER_HPP_ 38 #define CLOE_HANDLER_HPP_ 123 virtual const std::string& body()
const = 0;
128 virtual const std::string& uri()
const = 0;
137 virtual const std::string& endpoint()
const = 0;
142 virtual const std::map<std::string, std::string>& query_map()
const = 0;
148 virtual bool has_json()
const {
return this->type() == ContentType::JSON; }
153 virtual Json
as_json()
const {
return fable::parse_json(body()); }
168 PARTIAL_CONTENT = 206,
169 MULTIPLE_CHOICES = 300,
170 MOVED_PERMANENTLY = 301,
175 TEMPORARY_REDIRECT = 307,
181 NOT_ACCEPTABLE = 406,
182 REQUEST_TIMEOUT = 408,
186 NOT_IMPLEMENTED = 501,
187 SERVICE_UNAVAILABLE = 503,
227 const std::map<std::string, std::string>&
headers()
const {
return headers_; }
228 std::map<std::string, std::string>& headers() {
return headers_; }
233 bool has_header(
const std::string& key) {
return this->headers().count(key) != 0; }
241 const std::string&
header(
const std::string& key) {
return this->headers().at(key); }
247 void set_header(
const std::string& key,
const std::string& value) {
248 this->headers()[key] = value;
252 void set_status(
StatusCode code) { status_ = code; }
257 this->set_header(
"Content-Type", as_cstr(type));
260 const std::string& body()
const {
return body_; }
266 if (!s.empty() && status_ == StatusCode::NO_CONTENT) {
267 status_ = StatusCode::OK;
269 this->set_type(type);
281 this->set_body(js.dump(), ContentType::JSON);
283 this->set_body(js.dump(4), ContentType::JSON);
290 void write(
const Json& js) { this->set_body(js); }
296 void bad_request(
const Json& js) { this->error(StatusCode::BAD_REQUEST, js); }
301 void not_found(
const Json& js) { this->error(StatusCode::NOT_FOUND, js); }
312 this->set_status(StatusCode::NOT_ALLOWED);
313 this->set_header(
"Allow", as_cstr(allow));
321 void not_implemented(
const Json& js) { this->error(StatusCode::NOT_IMPLEMENTED, js); }
326 void server_error(
const Json& js) { this->error(StatusCode::SERVER_ERROR, js); }
330 this->set_status(code);
337 std::map<std::string, std::string> headers_;
348 using Handler = std::function<void(const Request&, Response&)>;
364 explicit Redirect(
const std::string& location) : location_(location) {}
366 r.set_status(StatusCode::FOUND);
371 std::string location_;
394 template <
typename T>
397 explicit ToJson(
const T* ptr) : ptr_(ptr) {}
423 : ptr_(ptr), convert_(query_map_as_json) {}
434 #endif // CLOE_HANDLER_HPP_ bool has_header(const std::string &key)
Definition: handler.hpp:233
const std::string & header(const std::string &key)
Definition: handler.hpp:241
const std::map< std::string, std::string > & headers() const
Definition: handler.hpp:227
RequestMethod
Definition: handler.hpp:55
Response()
Definition: handler.hpp:202
Definition: confable.hpp:46
Definition: handler.hpp:197
StatusCode
Definition: handler.hpp:162
Definition: handler.hpp:95
void set_body(const Json &js)
Definition: handler.hpp:279
void set_body(const std::string &s, ContentType type)
Definition: handler.hpp:265
ContentType
Definition: handler.hpp:72
void write(const Json &js)
Definition: handler.hpp:290
std::function< void(const Request &, Response &)> Handler
Definition: handler.hpp:348
Definition: coordinator.hpp:36
Definition: handler.hpp:395
void bad_request(const Json &js)
Definition: handler.hpp:296
void not_implemented(const Json &js)
Definition: handler.hpp:321
void set_header(const std::string &key, const std::string &value)
Definition: handler.hpp:247
virtual bool has_json() const
Definition: handler.hpp:148
virtual Json as_json() const
Definition: handler.hpp:153
void not_found(const Json &js)
Definition: handler.hpp:301
void server_error(const Json &js)
Definition: handler.hpp:326
Definition: handler.hpp:377
Definition: handler.hpp:420
Definition: handler.hpp:362
void not_allowed(const RequestMethod &allow, const Json &js)
Definition: handler.hpp:311