MantisBase v0.3.5
Loading...
Searching...
No Matches
http.h
Go to the documentation of this file.
1#ifndef MB_HTTP_H
2#define MB_HTTP_H
3
4
5#include "exceptions.h"
6#include "models/entity.h"
7
8#ifdef MB_SCRIPTING_ENABLED
9#include <dukglue/dukglue.h>
10#endif
11
12#include "route_registry.h"
13#include "context_store.h"
14#include "../utils/utils.h"
15#include "types.h"
16#include <fstream>
17
18namespace mb {
19#ifdef MB_SCRIPTING_ENABLED
20 class DuktapeImpl {
21 public:
22 static duk_ret_t nativeConsoleInfo(duk_context *ctx);
23
24 static duk_ret_t nativeConsoleTrace(duk_context *ctx);
25
26 static duk_ret_t nativeConsoleTable(duk_context *ctx);
27 };
28#endif
29
40 const httplib::Request &m_req;
41 ContextStore m_store;
42
43 const std::string __class_name__ = "mb::MantisRequest";
44
45 public:
56 explicit MantisRequest(const httplib::Request &_req);
57
62 std::string getMethod() const;
63
68 std::string getPath() const;
69
74 std::string getBody() const;
75
80 std::string getRemoteAddr() const;
81
86 int getRemotePort() const;
87
92 std::string getLocalAddr() const;
93
98 int getLocalPort() const;
99
105 bool hasHeader(const std::string &key) const;
106
114 std::string getHeaderValue(const std::string &key, const char *def, size_t id) const;
115
123 size_t getHeaderValueU64(const std::string &key, size_t def, size_t id) const;
124
130 size_t getHeaderValueCount(const std::string &key) const;
131
137 bool hasTrailer(const std::string &key) const;
138
145 std::string getTrailerValue(const std::string &key, size_t id) const;
146
152 size_t getTrailerValueCount(const std::string &key) const;
153
158 httplib::Match matches() const;
159
165 bool hasQueryParam(const std::string &key) const;
166
172 std::string getQueryParamValue(const std::string &key) const;
173
180 std::string getQueryParamValue(const std::string &key, size_t id) const;
181
187 size_t getQueryParamValueCount(const std::string &key) const;
188
193 bool hasPathParams() const;
194
200 bool hasPathParam(const std::string &key) const;
201
212 std::string getPathParamValue(const std::string &key) const;
213
219 size_t getPathParamValueCount(const std::string &key) const;
220
225 bool isMultipartFormData() const;
226
231
237 bool hasKey(const std::string &key) const;
238
243 std::string getBearerTokenAuth() const;
244
251 std::pair<nlohmann::json, std::string> getBodyAsJson() const;
252
263 template<typename T>
264 void set(const std::string &key, T value) {
265 m_store.set(key, value);
266 }
267
268 // template<typename T>
269 // std::optional<T *> get(const std::string &key) {
270 // return m_store.get<T>(key);
271 // }
272
284 template<typename T>
285 T &getOr(const std::string &key, T default_value) {
286 return m_store.getOr<T>(key, default_value);
287 }
288
289 private:
290#ifdef MB_SCRIPTING_ENABLED
291 // Context Methods for setting and getting context values
292 DukValue get_duk(const std::string &key);
293 DukValue getOr_duk(const std::string &key, const DukValue &default_value);
294 void set_duk(const std::string &key, const DukValue &value);
295#endif
296 };
297
316 httplib::Response &m_res;
317
318 const std::string __class_name__ = "mb::MantisResponse";
319
320 public:
325 explicit MantisResponse(httplib::Response &_resp);
326
330 ~MantisResponse() = default;
331
332 httplib::Response &getResponse() const;
333
338 [[nodiscard]] int getStatus() const;
339
344 void setStatus(int s);
345
350 [[nodiscard]] std::string getVersion() const;
351
356 void setVersion(const std::string &b);
357
362 [[nodiscard]] std::string getBody() const;
363
368 void setBody(const std::string &b);
369
374 [[nodiscard]] std::string getLocation() const;
375
380 void setLocation(const std::string &b);
381
386 [[nodiscard]] std::string getReason() const;
387
392 void setReason(const std::string &b);
393
399 [[nodiscard]] bool hasHeader(const std::string &key) const;
400
408 std::string getHeaderValue(const std::string &key, const char *def = "", size_t id = 0) const;
409
417 [[nodiscard]] size_t getHeaderValueU64(const std::string &key, size_t def = 0, size_t id = 0) const;
418
424 [[nodiscard]] size_t getHeaderValueCount(const std::string &key) const;
425
431 void setHeader(const std::string &key, const std::string &val) const;
432
438 [[nodiscard]] bool hasTrailer(const std::string &key) const;
439
446 [[nodiscard]] std::string getTrailerValue(const std::string &key, size_t id = 0) const;
447
453 [[nodiscard]] size_t getTrailerValueCount(const std::string &key) const;
454
460 void setRedirect(const std::string &url, int status = httplib::StatusCode::Found_302) const;
461
468 void setContent(const char *s, size_t n, const std::string &content_type) const;
469
475 void setContent(const std::string &s, const std::string &content_type) const;
476
482 void setContent(std::string &&s, const std::string &content_type) const;
483
489 void setFileContent(const std::string &path, const std::string &content_type) const;
490
495 void setFileContent(const std::string &path) const;
496
503 void send(int statusCode, const std::string &data = "", const std::string &content_type = "text/plain") const;
504
513 void sendJSON(int statusCode = 200, const json &data = json::object()) const;
514#ifdef MB_SCRIPTING_ENABLED
520 void sendJson(int statusCode, const DukValue &data) const;
521#endif
527 void sendText(int statusCode = 200, const std::string &data = "") const;
528
534 void sendHtml(int statusCode = 200, const std::string &data = "") const;
535
540 void sendEmpty(int statusCode = 204) const;
541
546 };
547
550 const httplib::ContentReader &m_reader;
551 const MantisRequest &m_req;
552
553 std::vector<httplib::FormData> m_formData;
554 json m_json{}, m_filesMetadata{};
555 bool m_parsed = false;
556
557 public:
558 explicit MantisContentReader(const httplib::ContentReader &reader, const MantisRequest &req);
559
560 [[nodiscard]] const httplib::ContentReader &reader() const;
561
562 [[nodiscard]] bool isMultipartFormData() const;
563
564 [[nodiscard]] const std::vector<httplib::FormData> &formData() const;
565
566 [[nodiscard]] const json &filesMetadata() const;
567
568 [[nodiscard]] const json &jsonBody() const;
569
570 void parseFormDataToEntity(const Entity &entity);
571
572 void writeFiles(const std::string& entity_name);
573
574 void undoWrittenFiles(const std::string& entity_name);
575
576 static std::string hashMultipartMetadata(const httplib::FormData& data);
577
578 private:
579 void read();
580
581 void readMultipart();
582
583 void readJSON();
584
585 static json getValueFromType(const std::string& type, const std::string& value);
586 };
587} // mb
588
589#endif //MB_HTTP_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:549
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:39
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:264
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:224
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:285
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:315
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:16
nlohmann::json json
Shorten JSON namespace.
Definition context_store.h:18
Route registry.
Type definitions and aliases for MantisBase.