-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathhttpResource.h
More file actions
85 lines (75 loc) · 2.6 KB
/
httpResource.h
File metadata and controls
85 lines (75 loc) · 2.6 KB
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#pragma once
#include <httpserver.hpp>
#include "dbGate.h"
extern logger LOGGER;
using namespace httpserver;
class dbQueryResource : public http_resource {
private:
dbGate *db;
public:
explicit dbQueryResource(class dbGate *db) : db(db) {}
std::shared_ptr<http_response> render_POST(const http_request &req) override {
auto body = req.get_content();
LOGGER.info("[REQUEST] Body: " + std::string(body));
ldsRet ret{};
db->parseAndExecute(std::string(body), ret);
std::string resp;
switch (ret.type) {
case RET_STR:
if (ret.ptr == nullptr) {
resp = "(nil)";
break;
}
resp = "\"" + *(std::string *) ret.ptr + "\"";
delete (std::string *) ret.ptr;
break;
case RET_INT:
if (ret.ptr == nullptr) {
resp = "(nil)";
break;
}
resp = "(integer) " + std::to_string(*(int *) ret.ptr);
delete (int *) ret.ptr;
break;
case RET_BOOL:
if (ret.ptr == nullptr) {
resp = "(nil)";
break;
}
resp = *(bool *) ret.ptr ? "1" : "0";
delete (bool *) ret.ptr;
break;
case RET_OK:
resp = "OK";
break;
case RET_LIST: {
if (ret.ptr == nullptr) {
resp = "(empty list)";
break;
}
auto *list = (std::vector<std::string> *) ret.ptr;
if (list->empty()) {
resp = "(empty list)";
break;
}
resp = "1) \"" + list->at(0) + "\"";
for (int i = 1; i < list->size(); i++) {
resp += "\n" + std::to_string(i + 1) + ") \"" + list->at(i) + "\"";
}
delete list;
break;
}
case RET_ERR:
resp = "ERROR: " + *(std::string *) ret.ptr;
delete (std::string *) ret.ptr;
break;
case RET_UNKNOWN:
resp = "ERROR: An error occurred.";
break;
}
return std::shared_ptr<http_response>(new string_response(resp));
}
std::shared_ptr<http_response> render(const http_request &) override {
return std::shared_ptr<http_response>(new string_response("Invalid request method. Use POST instead."));
}
};