MantisBase v0.3.4
Loading...
Searching...
No Matches
http.h
Go to the documentation of this file.
1//
2// Created by allan on 07/10/2025.
3//
4
5#ifndef MANTISAPP_DUKTAPE_CUSTOM_TYPES_H
6#define MANTISAPP_DUKTAPE_CUSTOM_TYPES_H
7#include "exceptions.h"
8#include "models/entity.h"
9
10#ifdef MANTIS_ENABLE_SCRIPTING
11#include <dukglue/dukglue.h>
12#endif
13
16#include "../utils/utils.h"
17#include "types.h"
18
19#include <fstream>
20
21namespace mb {
22#ifdef MANTIS_ENABLE_SCRIPTING
23 class DuktapeImpl {
24 public:
25 static duk_ret_t nativeConsoleInfo(duk_context *ctx);
26
27 static duk_ret_t nativeConsoleTrace(duk_context *ctx);
28
29 static duk_ret_t nativeConsoleTable(duk_context *ctx);
30 };
31#endif
32
43 const httplib::Request &m_req;
44 ContextStore m_store;
45
46 const std::string __class_name__ = "mb::MantisRequest";
47
48 public:
59 explicit MantisRequest(const httplib::Request &_req);
60
65 std::string getMethod() const;
66
71 std::string getPath() const;
72
77 std::string getBody() const;
78
83 std::string getRemoteAddr() const;
84
89 int getRemotePort() const;
90
95 std::string getLocalAddr() const;
96
101 int getLocalPort() const;
102
108 bool hasHeader(const std::string &key) const;
109
117 std::string getHeaderValue(const std::string &key, const char *def, size_t id) const;
118
126 size_t getHeaderValueU64(const std::string &key, size_t def, size_t id) const;
127
133 size_t getHeaderValueCount(const std::string &key) const;
134
140 bool hasTrailer(const std::string &key) const;
141
148 std::string getTrailerValue(const std::string &key, size_t id) const;
149
155 size_t getTrailerValueCount(const std::string &key) const;
156
161 httplib::Match matches() const;
162
168 bool hasQueryParam(const std::string &key) const;
169
175 std::string getQueryParamValue(const std::string &key) const;
176
183 std::string getQueryParamValue(const std::string &key, size_t id) const;
184
190 size_t getQueryParamValueCount(const std::string &key) const;
191
196 bool hasPathParams() const;
197
203 bool hasPathParam(const std::string &key) const;
204
215 std::string getPathParamValue(const std::string &key) const;
216
222 size_t getPathParamValueCount(const std::string &key) const;
223
228 bool isMultipartFormData() const;
229
234
240 bool hasKey(const std::string &key) const;
241
246 std::string getBearerTokenAuth() const;
247
254 std::pair<nlohmann::json, std::string> getBodyAsJson() const;
255
266 template<typename T>
267 void set(const std::string &key, T value) {
268 m_store.set(key, value);
269 }
270
271 // template<typename T>
272 // std::optional<T *> get(const std::string &key) {
273 // return m_store.get<T>(key);
274 // }
275
287 template<typename T>
288 T &getOr(const std::string &key, T default_value) {
289 return m_store.getOr<T>(key, default_value);
290 }
291
292 private:
293#ifdef MANTIS_ENABLE_SCRIPTING
294 // Context Methods for setting and getting context values
295 DukValue get_duk(const std::string &key);
296 DukValue getOr_duk(const std::string &key, const DukValue &default_value);
297 void set_duk(const std::string &key, const DukValue &value);
298#endif
299 };
300
319 httplib::Response &m_res;
320
321 const std::string __class_name__ = "mb::MantisResponse";
322
323 public:
328 explicit MantisResponse(httplib::Response &_resp);
329
333 ~MantisResponse() = default;
334
335 httplib::Response &getResponse() const;
336
341 [[nodiscard]] int getStatus() const;
342
347 void setStatus(int s);
348
353 [[nodiscard]] std::string getVersion() const;
354
359 void setVersion(const std::string &b);
360
365 [[nodiscard]] std::string getBody() const;
366
371 void setBody(const std::string &b);
372
377 [[nodiscard]] std::string getLocation() const;
378
383 void setLocation(const std::string &b);
384
389 [[nodiscard]] std::string getReason() const;
390
395 void setReason(const std::string &b);
396
402 [[nodiscard]] bool hasHeader(const std::string &key) const;
403
411 std::string getHeaderValue(const std::string &key, const char *def = "", size_t id = 0) const;
412
420 [[nodiscard]] size_t getHeaderValueU64(const std::string &key, size_t def = 0, size_t id = 0) const;
421
427 [[nodiscard]] size_t getHeaderValueCount(const std::string &key) const;
428
434 void setHeader(const std::string &key, const std::string &val) const;
435
441 [[nodiscard]] bool hasTrailer(const std::string &key) const;
442
449 [[nodiscard]] std::string getTrailerValue(const std::string &key, size_t id = 0) const;
450
456 [[nodiscard]] size_t getTrailerValueCount(const std::string &key) const;
457
463 void setRedirect(const std::string &url, int status = httplib::StatusCode::Found_302) const;
464
471 void setContent(const char *s, size_t n, const std::string &content_type) const;
472
478 void setContent(const std::string &s, const std::string &content_type) const;
479
485 void setContent(std::string &&s, const std::string &content_type) const;
486
492 void setFileContent(const std::string &path, const std::string &content_type) const;
493
498 void setFileContent(const std::string &path) const;
499
506 void send(int statusCode, const std::string &data = "", const std::string &content_type = "text/plain") const;
507
516 void sendJSON(int statusCode = 200, const json &data = json::object()) const;
517#ifdef MANTIS_ENABLE_SCRIPTING
523 void sendJson(int statusCode, const DukValue &data) const;
524#endif
530 void sendText(int statusCode = 200, const std::string &data = "") const;
531
537 void sendHtml(int statusCode = 200, const std::string &data = "") const;
538
543 void sendEmpty(int statusCode = 204) const;
544
549 };
550
553 const httplib::ContentReader &m_reader;
554 const MantisRequest &m_req;
555
556 std::vector<httplib::FormData> m_formData;
557 json m_json{}, m_filesMetadata{};
558 bool m_parsed = false;
559
560 public:
561 explicit MantisContentReader(const httplib::ContentReader &reader, const MantisRequest &req);
562
563 [[nodiscard]] const httplib::ContentReader &reader() const;
564
565 [[nodiscard]] bool isMultipartFormData() const;
566
567 [[nodiscard]] const std::vector<httplib::FormData> &formData() const;
568
569 [[nodiscard]] const json &filesMetadata() const;
570
571 [[nodiscard]] const json &jsonBody() const;
572
573 void parseFormDataToEntity(const Entity &entity);
574
575 void writeFiles(const std::string& entity_name);
576
577 void undoWrittenFiles(const std::string& entity_name);
578
579 static std::string hashMultipartMetadata(const httplib::FormData& data);
580
581 private:
582 void read();
583
584 void readMultipart();
585
586 void readJSON();
587
588 static json getValueFromType(const std::string& type, const std::string& value);
589 };
590} // mb
591
592#endif //MANTISAPP_DUKTAPE_CUSTOM_TYPES_H
Definition context_store.h:55
T & getOr(const std::string &key, T default_value)
Get context value given the key.
Definition context_store.h:112
void set(const std::string &key, T value)
Store a key-value data in the context.
Definition context_store.h:81
Represents a database table/entity with schema and CRUD operations.
Definition entity.h:39
‍Middleware shorthand for the content reader
Definition http.h:552
static std::string hashMultipartMetadata(const httplib::FormData &data)
Definition http_content_reader.cpp:214
void parseFormDataToEntity(const Entity &entity)
Definition http_content_reader.cpp:43
void writeFiles(const std::string &entity_name)
Definition http_content_reader.cpp:171
const httplib::ContentReader & reader() const
Definition http_content_reader.cpp:13
const json & filesMetadata() const
Definition http_content_reader.cpp:35
const json & jsonBody() const
Definition http_content_reader.cpp:39
const std::vector< httplib::FormData > & formData() const
Definition http_content_reader.cpp:31
bool isMultipartFormData() const
Definition http_content_reader.cpp:15
void undoWrittenFiles(const std::string &entity_name)
Definition http_content_reader.cpp:203
A wrapper class around httplib::Request offering a consistent API and allowing for easy wrapper metho...
Definition http.h:42
bool hasKey(const std::string &key) const
Check if context store has key.
Definition http_request.cpp:211
int getRemotePort() const
Get client remote port.
Definition http_request.cpp:47
std::string getBody() const
Get raw request body.
Definition http_request.cpp:14
void set(const std::string &key, T value)
Store value in request context (for middleware communication).
Definition http.h:267
bool hasQueryParam(const std::string &key) const
Check if query parameter exists.
Definition http_request.cpp:86
bool hasTrailer(const std::string &key) const
Check if trailer exists.
Definition http_request.cpp:71
std::pair< nlohmann::json, std::string > getBodyAsJson() const
Parse request body as JSON.
Definition http_request.cpp:219
bool hasPathParam(const std::string &key) const
Check if path parameter exists.
Definition http_request.cpp:105
std::string getRemoteAddr() const
Get client remote address.
Definition http_request.cpp:16
std::string getPathParamValue(const std::string &key) const
Get path parameter value.
Definition http_request.cpp:109
static void registerDuktapeMethods()
Register MantisRequest methods for JavaScript/Duktape.
std::string getLocalAddr() const
Get server local address.
Definition http_request.cpp:49
std::string getPath() const
Get request path.
Definition http_request.cpp:12
size_t getQueryParamValueCount(const std::string &key) const
Get count of query parameter values.
Definition http_request.cpp:99
size_t getTrailerValueCount(const std::string &key) const
Get count of trailer values.
Definition http_request.cpp:80
std::string getMethod() const
Get HTTP request method (GET, POST, etc.).
Definition http_request.cpp:10
bool isMultipartFormData() const
Check if request is multipart/form-data.
Definition http_request.cpp:123
size_t getHeaderValueU64(const std::string &key, size_t def, size_t id) const
Get header value as unsigned 64-bit integer.
Definition http_request.cpp:62
bool hasHeader(const std::string &key) const
Check if header exists.
Definition http_request.cpp:53
int getLocalPort() const
Get server local port.
Definition http_request.cpp:51
std::string getHeaderValue(const std::string &key, const char *def, size_t id) const
Get header value with default and index.
Definition http_request.cpp:57
std::string getBearerTokenAuth() const
Extract Bearer token from Authorization header.
Definition http_request.cpp:215
T & getOr(const std::string &key, T default_value)
Get value from context store or return default.
Definition http.h:288
std::string getTrailerValue(const std::string &key, size_t id) const
Get trailer value.
Definition http_request.cpp:75
size_t getHeaderValueCount(const std::string &key) const
Get count of header values.
Definition http_request.cpp:67
size_t getPathParamValueCount(const std::string &key) const
Get count of path parameter values.
Definition http_request.cpp:116
bool hasPathParams() const
Check if request has path parameters.
Definition http_request.cpp:103
std::string getQueryParamValue(const std::string &key) const
Get query parameter value (first occurrence).
Definition http_request.cpp:90
httplib::Match matches() const
Get route match information.
Definition http_request.cpp:84
Wrapper around httplib::Response for consistent API.
Definition http.h:318
std::string getHeaderValue(const std::string &key, const char *def="", size_t id=0) const
Get header value.
Definition http_response.cpp:69
bool hasHeader(const std::string &key) const
Check if header exists.
Definition http_response.cpp:64
void setRedirect(const std::string &url, int status=httplib::StatusCode::Found_302) const
Set redirect response.
Definition http_response.cpp:104
std::string getLocation() const
Get redirect location.
Definition http_response.cpp:44
size_t getHeaderValueCount(const std::string &key) const
Get count of header values.
Definition http_response.cpp:79
void sendText(int statusCode=200, const std::string &data="") const
Send text response.
Definition http_response.cpp:140
static void registerDuktapeMethods()
Register MantisResponse methods for JavaScript/Duktape.
void sendHtml(int statusCode=200, const std::string &data="") const
Send HTML response.
Definition http_response.cpp:172
void setFileContent(const std::string &path, const std::string &content_type) const
Set response content from file with MIME type.
Definition http_response.cpp:124
~MantisResponse()=default
Destructor.
void setVersion(const std::string &b)
Set HTTP version.
Definition http_response.cpp:29
void send(int statusCode, const std::string &data="", const std::string &content_type="text/plain") const
Send response with status, data, and content type.
Definition http_response.cpp:134
std::string getBody() const
Get response body.
Definition http_response.cpp:34
httplib::Response & getResponse() const
Definition http_response.cpp:12
void setLocation(const std::string &b)
Set redirect location.
Definition http_response.cpp:49
std::string getVersion() const
Get HTTP version.
Definition http_response.cpp:24
void sendEmpty(int statusCode=204) const
Send empty response (no body).
Definition http_response.cpp:177
void setHeader(const std::string &key, const std::string &val) const
Set response header.
Definition http_response.cpp:84
bool hasTrailer(const std::string &key) const
Check if trailer exists.
Definition http_response.cpp:89
std::string getTrailerValue(const std::string &key, size_t id=0) const
Get trailer value.
Definition http_response.cpp:94
void setContent(const char *s, size_t n, const std::string &content_type) const
Set response content from buffer.
Definition http_response.cpp:109
int getStatus() const
Get HTTP status code.
Definition http_response.cpp:14
void setReason(const std::string &b)
Set status reason phrase.
Definition http_response.cpp:59
void setStatus(int s)
Set HTTP status code.
Definition http_response.cpp:19
void setBody(const std::string &b)
Set response body.
Definition http_response.cpp:39
size_t getTrailerValueCount(const std::string &key) const
Get count of trailer values.
Definition http_response.cpp:99
size_t getHeaderValueU64(const std::string &key, size_t def=0, size_t id=0) const
Get header value as unsigned 64-bit integer.
Definition http_response.cpp:74
void sendJSON(int statusCode=200, const json &data=json::object()) const
Send JSON response.
Definition http_response.cpp:145
std::string getReason() const
Get status reason phrase.
Definition http_response.cpp:54
Entity class for database table operations and CRUD functionality.
Custom exception class for MantisBase errors.
router.h
Definition auth.h:15
nlohmann::json json
Shorten JSON namespace.
Definition context_store.h:18
Route registry.
Type definitions and aliases for MantisBase.